我是iOS中的任何東西,
我想把一些工作外包出去 |
我是外包者,我想外包你的工程,
但我不知道你的工作內容是不是符合我? |
我是protocol協定,我定義了4個洞的工作,任何東西說只要符合我這個protocol協定,就可以幫anything作事。
|
哦Yes,我是外包者,我剛好有4個腳,
會作這個4個洞的工作。 |
任何東西說:「即然你符合protocol協定的4個洞的工作要求,那就讓我們合作愉快吧,我把事情委派給你」。
|
以UITableView為例,接下來的範例,UITableView將會把"產生資料"的工作進行委派,將工作交辦給另一個物件。
第1步:建立一個名為"Delegate_Protocol"的"Single View Application"專案。
第2步:加入"UITableView"至畫面中。
第3步:建立UIViewTable的IBOutlet,並取名為"tableView"。
第4步:為"ViewController"加上"UITableViewDataSource" protocol協定,以擁有載入資料至UITableView的能力。
- 4.1 為"ViewController"加上"UITableViewDataSource" protocol協定,於UIViewController後方加上"<UITableViewDataSource>"
@interface ViewController : UIViewController <UITableViewDataSource>
@end
- 4.2 於"ViewController.m"檔中實作 "– tableView:numberOfRowsInSection:"方法,以回傳資料的列數,在此回傳3,表示3列資料。
- (NSInteger)tableView:(UITableView *)tableView
numberOfRowsInSection:(NSInteger)section
{
//回傳3,表示有3筆資料
return 3;
}
//回傳3,表示有3筆資料
return 3;
}
- 4.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;
}
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;
}
第5步:將實作"UITableViewDataSource"的ViewController(self),指派至UIViewTable的dataSource屬性中,好將UITableView取得資料的工作委派給ViewController(self)物件。當然,UITableView則會以"UITableViewDataSource"protocol協定向ViewController物件要資料。
- (void)viewDidLoad
{
[super viewDidLoad];
//將實作UIViewTableDataSource的ViewController(self),
//指派給UITable的dataSource屬性中,
//好將UITableView取得資料的工作,
//委派給ViewController(self)物件。
self.tableView.dataSource = self;
}
[super viewDidLoad];
//將實作UIViewTableDataSource的ViewController(self),
//指派給UITable的dataSource屬性中,
//好將UITableView取得資料的工作,
//委派給ViewController(self)物件。
self.tableView.dataSource = self;
}
第6步:執行,這時畫面上會出現3筆資料,而資料則是以委派的方法,委派給實作"UITableViewDataSource"protocol協定的ViewController物件所提供的。
檔案連結:Delegate_Protocol.zip