3

セル内にボタンがあり、カスタムセルへの出口があり、最初のViewController内にIBActionがあります。

-(IBAction)AddButton:(UIButton *)sender{

ProductCell *cell = (ProductCell *)sender.superview;
UITableView *tableView - (UITableView *)cell.superview;
NSIndexPath *indexPath = [tableView indexPathForCell:cell];

NSLog(@"Sender: %@, Super: %@", sender, sender.superview);

//[saveitemArray addObject: [itemArray objectAtIndex:(indexPath.row + 1)]];  
//[saveitemArray writeToFile:[self saveListPath] atomically:YES];
}

コードをステップスルーすると、送信者はUIButtonとして表示されますが、変数'cell'はFirstViewControllerとして表示されます。セルとテーブルを完全にスキップしているようです。私が見逃している簡単なことは何ですか?

アップデート:

さて、最後の2行をコメントアウトした後、完全なIBActionを表示しましたが、セル変数はCustomCell(正しいスーパービュー)として表示されていますが、tableView変数はCustomTableではなくFirstViewControllerスーパービューを表示していますか?NSLogも同じように表示されたので、cellとcell.superviewを表示するように変更しました。結果は次のとおりです。

Sender: <UITableViewCellContentView: 0x716fb20; frame = (0 0; 320 43);     
gestureRecognizers = <NSArray: 0x71711d0>; layer = <CALayer: 0x716fbd0>>, Super:   
<ProductCell: 0x716f820; baseClass = UITableViewCell; frame = (0 0; 320 44); autoresize 
= W; layer = <CALayer: 0x716f990>>

2番目の更新:

sender.superviewはCell自体ではなくCellContentViewであると思われるため、indexPathを取得しようとすると、セルをテーブルとして使用し、CellContentViewをセルとして使用しようとします。ContentViewを通過する必要はないと思いましたが、ボタンからの.superviewはセル自体に直接移動すると思いましたか?

回答:

この順序で階層を通過する必要があるようです。

ボタン->CellContentView->セル->TableView

4

1 に答える 1

3

interface-builderでIBOutletsを接続しているときに問題が発生したと思います。

アクションにブレークポイントを設定し、ビュー全体をデバッガーに再帰的に記録して確認します。

po[[セルフビュー]recursiveDescription];

更新

更新に基づいて、ボタンではなくアクションをセルに追加したようです。

アップデート2:

- (IBAction) AddButton:(UIButton *)sender{

    UIView *cellContentView = (UIView *)sender.superview;
    ProductCell *cell = (ProductCell *)cellContentView.superview;
    UITableView *tableView - (UITableView *)cell.superview;
    NSIndexPath *indexPath = [tableView indexPathForCell:cell];

}

または、このメソッドでボタンにタグを付けることができます。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    //your setup code here..

    cell.yourButton.tag = indexPath.row;

}

..セクションが1つしかない場合は、ここでインデックスパスにアクセスします。

- (IBAction) AddButton:(UIButton *)sender{
    NSIndexPath *indexPath = [NSIndexPath indexPathForRow:sender.tag inSection:0];
}

やるべきだ!

于 2012-10-23T15:13:10.933 に答える