20

私は現在、別のペン先にあるカスタム UITableViewCell が取り込まれた UITableView を持っています。セルには、カスタム セル クラスのアクションに関連付けられた 2 つのボタンがあります。ボタンの 1 つをクリックすると、適切なメソッドを呼び出すことができますが、ボタンが押された行を知る必要があります。各ボタンのタグ プロパティは 0 になります。セル全体がいつ表示されるかを知る必要はありません。特定のボタンが押されたときに選択されるため、適切なオブジェクトを更新できるように、それがどの行であるかを知る必要があります。

4

10 に答える 10

21

はるかに簡単な解決策は、(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の新しいコールバックにボタンを再接続することを忘れないでください!

于 2010-01-19T12:07:52.110 に答える
10

他にタグを使用していない場合は、ボタンのプロパティを使用してtag、ボタンが作成された行を指定できます。

于 2009-06-22T22:37:52.583 に答える
5

タグやビュー階層に依存しない実装の場合は、次のようにします。

- (void)btnPressed:(id)sender event:(id)event
{
  UITouch *touch = [[event allTouches] anyObject];
  CGPoint touchPoint = [touch locationInView:self.tableView];
  NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:touchPoint];
}
于 2012-08-21T06:50:18.490 に答える
4

私は同じシナリオを持っています。これを実現するために、カスタム セルを派生させました。section と row の 2 つのプロパティを追加しました。また、派生した TableViewController クラスとなる所有者も追加しました。セルが要求されたら、所有者とともに、indexPath に基づいてセクション/行を設定します。

cell.section = indexPath.section cell.row = indexPath.row cell.owner = 自己

次にボタンを作成したときに、ボタン イベントを tableViewController ではなくセルに関連付けました。イベント ハンドラーは、セクションと行のエントリを読み取り、適切なメッセージ (またはイベント) を TableViewController に送信できます。これにより、既存の方法とハウスキーピングを活用し、セルを可能な限り自己完結型に保つことで、ハウスキーピングとメンテナンスが大幅に簡素化されます。システムはすでにセルを追跡しているのに、なぜそれを 2 回行うのでしょうか。

于 2009-11-03T15:56:30.170 に答える
3

さらに簡単:

-(IBAction) buttonPressed {
    NSIndexPath *myIndexPath = [(UITableView *)self.superview indexPathForCell: self];
    // do whatever you need to do with the information
}
于 2010-02-08T17:38:14.543 に答える
1

ボタンにアクセスして、ボタンを含むsuperviewを取得できUITableViewCellますが、行番号だけが必要な場合はtag、前の投稿 deacribes のようにプロパティを使用できます。

于 2009-06-22T22:50:37.877 に答える
1

問題を解決するには、複数の方法があります。

  1. 「tag」プロパティを使用できます。値 indexPath.row をボタンのタグ値として指定します。
    btn.tag = indexPath.row;

次に、ボタン関数でタグ値に簡単にアクセスでき、クリックされたボタンのインデックスになります。

-(void)btnClicked:(id)sender
{
    int index = [sender tag];
}
  1. レイヤ プロパティを使用できます indexPath をレイヤ ディクショナリの値として追加します。

    [[btn レイヤー] setValue:indexPath forKey:@"indexPath"];

この indexPath は、ボタン アクション関数からアクセスできます。

-(void)btnClicked:(id)sender
{
    NSIndexPath *indexPath = [[sender layer] valueForKey:@"indexPath"];
    int index = indexPath.row;
}

このメソッドを使用すると、異なるキーを持つ新しいオブジェクトを辞書に追加するだけで、ボタン関数に複数の値を渡すことができます。

于 2012-06-22T10:35:29.943 に答える
0

このソリューションは、ストーリーボード セル プロトタイプを使用して接続された 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);
}
于 2014-08-08T21:36:38.763 に答える