2015年9月26日 星期六

iOS筆記:Delegate and DataSource

委任(delegatation):

Delegation is a simple and powerful pattern in which one object in a program acts on behalf of, or in coordination with, another object. The delegating object keeps a reference to the other object—the delegate—and at the appropriate time sends a message to it. The message informs the delegate of an event that the delegating object is about to handle or has just handled. The delegate may respond to the message by updating the appearance or state of itself or other objects in the application, and in some cases it can return a value that affects how an impending event is handled. The main value of delegation is that it allows you to easily customize the behavior of several objects in one central object.

資料來源(data scorce):

A data source is almost identical to a delegate. The difference is in the relationship with the delegating object. Instead of being delegated control of the user interface, a data source is delegated control of data. The delegating object, typically a view object such as a table view, holds a reference to its data source and occasionally asks it for the data it should display. A data source, like a delegate, must adopt a protocol and implement at minimum the required methods of that protocol. Data sources are responsible for managing the memory of the model objects they give to the delegating view.

Delegation,委任是拜託別人做事,講白一點就是自己不想做或不會做,所以外包出去叫別人做。
要判斷對方是否有「能力」來接受我的委任,就是問這個被委任的人是否有符合(Conform)我訂的條件(Protocol),然後這個條件就跟面試新人一樣,某些技能是必須的(Required),但其它條件是非必須的(Optional)。

C# 中使用 events 在做的事情,在 Objective-C 中,我們往往使用 target/action 與 delegate 實作。
在網路上看到的一個例子

假如”我”的本職工作之一是「接電話」,但”我”發現太忙了或來電太雜了,於是我聘請一位”秘書”分擔我「接電話」的工作,如果電話是老闆打來的,就讓「秘書」將電話轉接給「我」。。。

那麼,「我」就是A Object. 「秘書」就是”我”的「Delegate」。寫成代碼就是 – [我 setDelegate:秘書];

enter image description here

範例

為”ViewController”加上”UITableViewDataSource” protocol協定,以擁有載入資料至UITableView的能力。

The UITableView‘s dataSource and delegate.!
The delegate is used to control how the table is displayed.!
The dataSource provides the data what is displayed inside the cells.!

1.1 為”ViewController”加上”UITableViewDataSource” protocol協定,於UIViewController後方加上"<UITableViewDataSource>"

    @interface ViewController : UIViewController <UITableViewDataSource> 
    @end 

1.2 於”ViewController.m”檔中實作 “– tableView:numberOfRowsInSection:”方法,以回傳資料的列數,在此回傳3,表示3列資料。

     - (NSInteger)tableView:(UITableView *)tableView 
       numberOfRowsInSection:(NSInteger)section
     {
          //回傳3,表示有3筆資料   
          return 3; 
     }

1.3 於”ViewController.m”檔中實作 “– tableView:cellForRowAtIndexPath:”方法,以依照列數回傳UITableViewCell物件,而UITableViewCell物件即是UITableView用來顯示一筆資料的物件。在此建立UITableViewCell物件,透過indexPath的row屬性取得列數,並轉成字串設定給UITableViewCell,最後回傳cell物件,以供UITabelView顯示於畫面上(在此為了更容易了解程式,以直接建立UITableView的方式取得cell物件,正確的寫法應是可將同性質的UITableViewCell拿來重複使用才對)。

      - (UITableViewCell *)tableView:(UITableView *)tableView 
               cellForRowAtIndexPath:(NSIndexPath *)indexPath 
      {

          //建立UITableViewCell物件
          UITableViewCell *cell = [[UITableViewCell alloc] init]; 

          //依indexPath的row屬性取得目前所在的列數, 
          //並透過NSString的initWithFormat將int轉換為字串。
          NSString *rowNumber = [[NSString alloc] initWithFormat:@"%i", [indexPath row] ]; 

          //UITableViewCell有個屬性為textLabel, 
          //其是⼀一個UILabel物件, 
          //透過setText可設定其顯示的字樣 
          [cell.textLabel setText:rowNumber]; 

          //回傳cell物件,以供UITableView顯示在畫面上 
          return cell;
       } 

第2步:將實作”UITableViewDataSource”的ViewController(self),指派至UIViewTable的dataSource屬性中,好將UITableView取得資料的工作委派給ViewController(self)物件。當然,UITableView則會以”UITableViewDataSource”protocol協定向ViewController物件要資料。

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    //將實作UIViewTableDataSourceViewController(self), 
    //指派給UITable的dataSource屬性中, 
    //好將UITableView取得資料的工作, 
    //委派給ViewController(self)物件。 
    self.tableView.dataSource = self; 
} 

第3步:執行,這時畫面上會出現3筆資料,而資料則是以委派的方法,委派給實作”UITableViewDataSource”protocol協定的ViewController物件所提供的。

Datasource VS Delegate

[Datasource]
1.Picker view 會問 datasource 它該如何表現
2.datasource 會告訴他你有 9欄的數量需要show 在 iphone 手機的 picker view 中

=> datasource 提供 picker view 如何展示它的資料內容。
換成通稱則為…

小結:datasource 會以控制項(picker view )預期的格式,提供給控制項(picker view)所需要的資訊 (9欄要show)。

[Delegate]
“當”使用者選取某個picker view 中的某個值後….

a.”當” 事情發生時,picker view 會告訴他的delegate。ex: user 選了第三列….
b. delegate 要準備對這個行為作反應。
(至於要怎麼做,我們先不管,所以圖中的b. 停在delegate 的框中,正準備要做反應。)

Protocols and Delegate

enter image description here

參考資料:
1. https://developer.apple.com/library/ios/documentation/General/Conceptual/DevPedia-CocoaCore/Delegation.html
2. http://blog.eddie.com.tw/2013/05/24/delegation-in-objective-c/
3. http://lokanghung.blogspot.tw/2013/06/ios-delegate-protocol.html
4. http://codex.wiki/post/125658-431

沒有留言:

張貼留言