[iOS] cell客製化 - delegate與protocol的應用範例

我知道這可能是很簡單的東西,但還是作個紀錄。

在一個ViewController裡面有一個Table View,我們客製化裡面的Cell,所以另外有一個Cell的class叫做CustomCell。CustomCell.xib上面有一些button,可能要處理一些邏輯,那這交給使用它的ViewController去處理這邏輯,這些button在CustomCell裡面有一些IBAcion,當然CustomCell.h裡面還有一個delegate。

以下說明我們要作的事情:要讓 ViewController 作為CustomCell的delegate,按下 CustomCell 上的按鈕時交給 ViewController 去處發方法(假設方法叫做methodA:)。

Protocol是很常和delegate一起用的pattern。protocol通常用於宣告一些讓遵守該protocol的class必須要實作的方法。我們希望 ViewController 要實作這個方法,所以在 ViewController 的標頭檔宣告它遵守 CellDelegate :

@interface ViewController : UIViewController<CellProtocol>

同時要在 CustomCell.h 裡面宣告這個protocol:

@protocol  CellDelegate<NSObject>
- (void) methodA:(CustomCell *)cell;
@end

以及該按鈕的IBAction以及CustomCell封裝的delegate特性:

@interface CustomCell : UITableViewCell

@property (nonatomic, assign) id <CellDelegate> delegate;

-(IBAction)btnAction:(id)sender;

@end

在CustomCell.m裡面將btnAction:給委託:

-(IBAction)btnAction:(id)sender
{
    [self.delegate methodA:self];
   
}

最後在ViewController.m裡面去設定delegate和實作methodA:就可以了:

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

....
cell.delegate=self; // 將cell的委託設定成ViewController
....

}

-(void)methodA:(CustomCell *)cell
{
     //  實作你要的功能
}

相信很多人都知道這作法了,只是我想清楚的描述一次基本的作法(說不定以前寫過了)。被委託的物件(CustomCell)必須要封裝它的受委託物件(ViewController),這是為了在被委託物件裡面呼叫受委託物件去執行需要受委託物件執行的方法。而受委託物件必須遵守某個我們定義的protocol,這是為了宣告需要受委託物件去實作的方法,也讓這方法在編譯期可被編譯器看到。最後我們在受委託物件裡面宣告他為被委託物件之委託,並且實作protocol宣告的方法。

留言