デリゲートは、進むべき道です。
他の回答で見たように、ビューを使用すると時代遅れになる可能性があります。明日は別のラッパーがあり、使用する必要があるかもしれませんcell superview]superview]superview]superview]
。タグを使用すると、セルを特定するためのn個のif else条件が作成されます。そのすべてを回避するためにデリゲートを設定します。(これにより、再利用可能なセルクラスが作成されます。同じセルクラスを基本クラスとして使用でき、デリゲートメソッドを実装するだけです。)
最初に、セルが通信(委任)ボタンをクリックするために使用するインターフェース(プロトコル)が必要です。(プロトコル用に別の.hファイルを作成し、テーブルビューコントローラーとカスタムセルクラスの両方に含めるか、カスタムセルクラスに追加して、とにかくテーブルビューコントローラーに含めることができます)
@protocol CellDelegate <NSObject>
- (void)didClickOnCellAtIndex:(NSInteger)cellIndex withData:(id)data;
@end
このプロトコルをカスタムセルおよびテーブルビューコントローラーに含めます。そして、Table View Controllerがこのプロトコルを確認することを確認してください。
カスタムセルで2つのプロパティを作成します。
@property (weak, nonatomic) id<CellDelegate>delegate;
@property (assign, nonatomic) NSInteger cellIndex;
でUIButton
IBActionデリゲートクリック:(同じことがビューコントローラに戻って委任する必要がカスタムセルクラスのいずれかのアクションのために行うことができます)
- (IBAction)buttonClicked:(UIButton *)sender {
if (self.delegate && [self.delegate respondsToSelector:@selector(didClickOnCellAtIndex:withData:)]) {
[self.delegate didClickOnCellAtIndex:_cellIndex withData:@"any other cell data/property"];
}
}
cellForRowAtIndexPath
セルをデキューした後のテーブルビューコントローラーで、上記のプロパティを設定します。
cell.delegate = self;
cell.cellIndex = indexPath.row; // Set indexpath if its a grouped table.
そして、デリゲートをテーブルビューコントローラーに実装します。
- (void)didClickOnCellAtIndex:(NSInteger)cellIndex withData:(id)data
{
// Do additional actions as required.
NSLog(@"Cell at Index: %d clicked.\n Data received : %@", cellIndex, data);
}
これは、テーブルビューコントローラーでカスタムセルボタンアクションを取得するための理想的なアプローチです。