2

各セルのアクセサリ ビューとして UIButton を追加した UITableView があります。将来の使用のために、ボタンのタグを現在の行として設定していることに注意してください。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    // Configure the cell...

    if(cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];

        cellButton = [UIButton buttonWithType:UIButtonTypeCustom];
        cellButton.frame = CGRectMake(0, 0, 30, 30);  

        [cellButton setBackgroundImage:[UIImage imageNamed:@"cellButton.png"] forState:UIControlStateNormal];        
        [cellButton addTarget:self action:@selector(cellButtonAction:) forControlEvents:UIControlEventTouchUpInside];


        cellButton.tag = indexPath.row;  // <= Will use this in the next method
        cell.accessoryView = cellButton;
    }


    //Load cell with row based data

    return cell;
}

これらのボタンの 1 つがタップされたら、セルに変更を加える必要があります。そこで、タグを使用してセルを取得する cellButtonAction を実装します。

-(void)editCommentButtonAction:(id)sender
{
    UIButton *button = sender;
    NSIndexPath *indexPath = [NSIndexPath indexPathForRow:button.tag inSection:0];
    UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];
    [self makeChangesToCell:cell];  
}

しかし、これは非常に回りくどい方法のようです。これを行うためのよりクリーンな方法はありますか?

4

6 に答える 6

5

contentViewしたがって、ボタンが直接にあると仮定します:

  • senderセルの contentView であるスーパービューを" " (つまり、ボタン) に問い合わせます

  • そのビューにその を要求しますsuperView。これはセルです

  • タブビューにこのセルのインデックスを尋ねます:

- (NSIndexPath *)indexPathForCell:(UITableViewCell *)cell

EDIT:実際には、スーパービューをウォークアップしてUITableViewCellまたはUICollectionViewCellの「KindOf」であるビューを探すだけの汎用メソッドまたは関数を使用しています。チャンピオンのように動作します!

Swift のコード:

func containingUITableViewCell(tableView: UITableView, var view: UIView) -> (UITableViewCell, NSIndexPath)? {
while let v = view.superview {
    view = v
    if view.isKindOfClass(UITableViewCell.self) {
        if let cell = view as? UITableViewCell, let indexPath = tableView.indexPathForCell(cell) {
            return (cell, indexPath)
        } else {
            return nil
        }
    }
}
return nil

}

func containingUICollectionViewCell(collectionView: UICollectionView, var view: UIView) -> (UICollectionViewCell, NSIndexPath)? {
    while let v = view.superview {
        view = v
        if view.isKindOfClass(UICollectionViewCell.self) {
            if let cell = view as? UICollectionViewCell, let indexPath = collectionView.indexPathForCell(cell) {
                return (cell, indexPath)
            } else {
                return nil
            }
        }
    }
    return nil
}
于 2012-07-26T14:16:12.757 に答える
2

あなたはより簡単な方法でそれを行うことができます。senderパラメータを使用してテーブルビューセルを取得します。次のコードを確認してください。

-(void)editCommentButtonAction:(id)sender
{
    UIButton *button = (UIButton *)sender;
    UITableViewCell *cell = (UITableViewCell*)[button superview];
    [self makeChangesToCell:cell];  
}

ここ、

  1. senderタイプのidをにキャストしていますUIButton
  2. superviewあなたはそのボタンのゲッターを呼んでいます、それはあなたにUITableViewCell
  3. カスタマイズを行います。
于 2012-07-26T18:03:20.983 に答える
1

私は同じ状況にありました。問題は、テーブルセル内にimageViewがあり、タップしたimageviewを保持するセルを取得したいということです..

//MyCell is subclass of UITableViewCell

    if ([[[[sender view] superview] superview] isKindOfClass:[MyCell class]]) {
        MyCell *cell = (MyCell *)[[[sender view] superview] superview];
        NSIndexPath *cellIndexPath = [myTable indexPathForCell:cell];
        NSLog(@"cellIndexPath: %@  - %@",cellIndexPath, [videoURLArray objectAtIndex:cellIndexPath.row]);

    }
  • [送信者ビュー] - imageView
  • [[sender view] superview] -- imageView が配置された場所 (この場合、imageView のスーパービューはセルの contentView です)
  • [[[sender view] superview] superview] --- contentView が配置された場所 -- セル

NSLog 部分は、タップされた imageView の正しい行とセクションを出力する必要があります。コードを変更するだけです。;)

于 2012-09-25T01:43:37.017 に答える
0

私が通常これを行う方法:

  • cell は、指定された行またはインデックス パスのデータを格納します
  • メソッド -didSelectSomething または -didSelectAtIndexPath でプロトコルを作成します。
  • セルは、データソースとなるプロトコルのインスタンスへの参照を保持します
  • ボタンアクションをペン先のセルに配線します
  • セルにデリゲートを呼び出させる
  • prepareForReuse でセルをクリーンアップすることを忘れないでください。状態をセルに保存すると、厄介なバグが発生する可能性があるため、再利用する場合は必ずクリーンアップしてください。

タグは本当のハックであり、複数のセクションがある場合は機能しません。nib のビューを並べ替えると、送信者のスーパービューが壊れます。

この特定のケース (アクセサリ ビュー) には、専用のテーブル デリゲート メソッドはありませんか?

于 2012-07-27T08:41:47.750 に答える