3

内部に「タップ」ボタンがあるカスタム UITableViewCell をロードする tableView を使用しています。ユーザーがボタンをクリックすると、メソッドが呼び出されます。

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{...
    [btnRowTap addTarget:self action:@selector(didButtonTouchUpInside:) forControlEvents:UIControlEventTouchDown];
 ...
return cell;
}

didButtonTouchUpInside メソッドでは、次の方法で選択された行の値を取得しようとしています。

-(IBAction)didButtonTouchUpInside:(id)sender{
UIButton *btn = (UIButton *) sender;
UITableViewCell *cell = (UITableViewCell *)btn.superview;
NSIndexPath *indexPath = [matchingCustTable indexPathForCell:cell];
NSLog(@"%d",indexPath.row);
}

問題は、任意の行でボタンをクリックすると、毎回同じ値の 0 が得られることです。どこが間違っていますか?

4

6 に答える 6

9

UITableViewCell のビュー階層に依存してはなりません。iOS7 ではセルのビュー階層が変更されるため、このアプローチは iOS7 では失敗します。ボタンと UITableViewCell の間に追加のビューがあります。

これを処理するより良い方法があります。

  1. ボタンフレームを変換して、テーブルビューに相対的になるようにします
  2. 新しいフレームの起点で indexPath を tableView に問い合わせる

.

-(IBAction)didButtonTouchUpInside:(id)sender{
    UIButton *btn = (UIButton *) sender;
    CGRect buttonFrameInTableView = [btn convertRect:btn.bounds toView:matchingCustTable];
    NSIndexPath *indexPath = [matchingCustTable indexPathForRowAtPoint:buttonFrameInTableView.origin];

    NSLog(@"%d",indexPath.row);
}
于 2013-08-29T12:02:29.700 に答える
5

メソッドにButtonタグをcellForRowAtIndexPath設定する方法設定前のように

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{...
    btnRowTap.tag=indexPath.row
    [btnRowTap addTarget:self action:@selector(didButtonTouchUpInside:) forControlEvents:UIControlEventTouchDown];
 ...
return cell;
}

タップされたセルは次のようになります:-

-(IBAction)didButtonTouchUpInside:(id)sender{
{
        UIButton *button = (UIButton*)sender;
        NSIndexPath *indPath = [NSIndexPath indexPathForRow:button.tag inSection:0];
        //Type cast it to CustomCell
        UITableViewCell *cell = (UITableViewCell*)[tblView1 cellForRowAtIndexPath:indPath];
        NSLog(@"%d",indPath.row);

}
于 2013-08-29T10:16:14.913 に答える
0

これがあなたのibActionのコードです。タグやその他のものを設定する必要はありません

 -(IBAction)didButtonTouchUpInside:(id)sender{
  NSIndexPath *indexPath =
        [tbl
         indexPathForCell:(UITableViewCell *)[[sender superview] superview]];
}
于 2013-08-29T12:00:02.317 に答える