私は現在、別のペン先にあるカスタム UITableViewCell が取り込まれた UITableView を持っています。セルには、カスタム セル クラスのアクションに関連付けられた 2 つのボタンがあります。ボタンの 1 つをクリックすると、適切なメソッドを呼び出すことができますが、ボタンが押された行を知る必要があります。各ボタンのタグ プロパティは 0 になります。セル全体がいつ表示されるかを知る必要はありません。特定のボタンが押されたときに選択されるため、適切なオブジェクトを更新できるように、それがどの行であるかを知る必要があります。
10 に答える
はるかに簡単な解決策は、(id)senderを使用してボタンのコールバックを定義し、それを使用してテーブルの行のインデックスを掘り下げることです。サンプルコードは次のとおりです。
- (IBAction)buttonWasPressed:(id)sender
{
NSIndexPath *indexPath =
[self.myTableView
indexPathForCell:(UITableViewCell *)[[sender superview] superview]];
NSUInteger row = indexPath.row;
// Do something with row index
}
ほとんどの場合、同じ行インデックスを使用してセルを作成/入力したので、ボタンが今何をすべきかを識別するのは簡単なはずです。タグをいじって整理する必要はありません!
明確化:現在-(IBAction)buttonWasPressedを使用している場合; -(IBAction)buttonWasPressed:(id)sender;として再定義するだけです。追加のコールバック引数があり、それを取得するために特別なことをする必要はありません。また、InterfaceBuilderの新しいコールバックにボタンを再接続することを忘れないでください!
他にタグを使用していない場合は、ボタンのプロパティを使用してtag
、ボタンが作成された行を指定できます。
タグやビュー階層に依存しない実装の場合は、次のようにします。
- (void)btnPressed:(id)sender event:(id)event
{
UITouch *touch = [[event allTouches] anyObject];
CGPoint touchPoint = [touch locationInView:self.tableView];
NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:touchPoint];
}
私は同じシナリオを持っています。これを実現するために、カスタム セルを派生させました。section と row の 2 つのプロパティを追加しました。また、派生した TableViewController クラスとなる所有者も追加しました。セルが要求されたら、所有者とともに、indexPath に基づいてセクション/行を設定します。
cell.section = indexPath.section cell.row = indexPath.row cell.owner = 自己
次にボタンを作成したときに、ボタン イベントを tableViewController ではなくセルに関連付けました。イベント ハンドラーは、セクションと行のエントリを読み取り、適切なメッセージ (またはイベント) を TableViewController に送信できます。これにより、既存の方法とハウスキーピングを活用し、セルを可能な限り自己完結型に保つことで、ハウスキーピングとメンテナンスが大幅に簡素化されます。システムはすでにセルを追跡しているのに、なぜそれを 2 回行うのでしょうか。
さらに簡単:
-(IBAction) buttonPressed {
NSIndexPath *myIndexPath = [(UITableView *)self.superview indexPathForCell: self];
// do whatever you need to do with the information
}
ボタンにアクセスして、ボタンを含むsuperview
を取得できUITableViewCell
ますが、行番号だけが必要な場合はtag
、前の投稿 deacribes のようにプロパティを使用できます。
問題を解決するには、複数の方法があります。
- 「tag」プロパティを使用できます。値 indexPath.row をボタンのタグ値として指定します。
btn.tag = indexPath.row;
次に、ボタン関数でタグ値に簡単にアクセスでき、クリックされたボタンのインデックスになります。
-(void)btnClicked:(id)sender
{
int index = [sender tag];
}
レイヤ プロパティを使用できます indexPath をレイヤ ディクショナリの値として追加します。
[[btn レイヤー] setValue:indexPath forKey:@"indexPath"];
この indexPath は、ボタン アクション関数からアクセスできます。
-(void)btnClicked:(id)sender
{
NSIndexPath *indexPath = [[sender layer] valueForKey:@"indexPath"];
int index = indexPath.row;
}
このメソッドを使用すると、異なるキーを持つ新しいオブジェクトを辞書に追加するだけで、ボタン関数に複数の値を渡すことができます。
このソリューションは、ストーリーボード セル プロトタイプを使用して接続された IBAction でも機能します
- (IBAction)viewMapPostsMarker:(UIButton*)sender{
// button > cellContentView > cellScrollView > cell
UITableViewCell *cell = (UITableViewCell *) sender.superview.superview.superview;
NSIndexPath *index = [self.mapPostsView indexPathForCell:cell];
NSLog(@" cell at index %d",index.row);
}