2009-05-30 9 views
8

私はカスタムcell.theテーブルビューを持っている多くのセクションとrows.iに分割されているセル上のカスタムボタンがあります。今私はそのボタンをクリックするとセクション番号と行番号を取得したい。 あなたのtableViewのセルを選択すると、以下のメソッドが呼び出され、このカスタムセルのセクション番号と行番号ボタンをクリックしますか?

答えて

26

ビューコントローラでUIControlイベント処理メソッドを実装し、それをのハンドラとして設定する必要があります。ボタン。

[theCell.button addTarget: self 
        action: @selector(buttonPressed:withEvent:) 
     forControlEvents: UIControlEventTouchUpInside]; 

は、その後、あなたのイベントハンドラは次のようになります:あなたの -tableView:cellForRowAtIndexPath:関数の内部で、あなたのような何かをするだろう、すなわちユーザーが行上のボタンをタップしたときに呼び出されない

- (void) buttonPressed: (id) sender withEvent: (UIEvent *) event 
{ 
    UITouch * touch = [[event touches] anyObject]; 
    CGPoint location = [touch locationInView: self.tableView]; 
    NSIndexPath * indexPath = [self.tableView indexPathForRowAtPoint: location]; 

    /* indexPath contains the index of the row containing the button */ 
    /* do whatever it is you need to do with the row data now */ 
} 
+6

少し修正... [イベントのタッチ]は[イベントallTouches] – dizy

+0

すべきです!これはまさに私が探しているものです...ありがとう.. – mshsayem

6

に関する任意のアイデア:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 

セクション番号にアクセスするために:正しい内の行番号を(アクセスするためにint section = indexPath.section;

をセクション):int row = indexPath.row;

+2

。彼らは行の背景自体をタップする場合にのみ呼び出されます。 –

8

いくつかの考え:

あなたはUITableViewCellのを見つけるまで、あなたがボタンのスーパー階層を反復処理することができ、その後、呼び出し - (NSIndexPath *)indexPathForCell:のUITableView上(のUITableViewCell *)のセル。

- (void)buttonClicked:(id)sender { 
    UIView *button = sender; 

    for (UIView *parent = [button superview]; parent != nil; parent = [parent superview]) { 
    if ([parent isKindOfClass: [UITableViewCell class]]) { 
     UITableViewCell *cell = (UITableViewCell *) parent;   
     NSIndexPath *path = [self.tableView indexPathForCell: cell]; 

     // now use the index path 

     break; // for 
    } 
    } 
} 

ボタンを使用して、行を参照するインデックスを格納することもできます。これは1つの整数しか保持しないので、セクションが1つの場合や、行をフラットリストとして管理している場合に最も適しています。

UITableViewCellをサブクラス化して、ボタンをカプセル化することもできます。あなたのUITableViewCellは、ボタンイベントに応答して、イベントを自らの代理人に再ブロードキャストし、自分自身を渡します。イベントデリゲートは、UITableViewの - (NSIndexPath *)indexPathForCell:(UITableViewCell *)セルを呼び出して、インデックスパスを取得できます。

1

の追加は、あなたのUITableViewCell subclassToのインスタンス変数は、セルのインデックスパスを保存することができます。

NSIndexPath *myIndexPath; 

あなたがセルを作成する場合:新しく作成されたにindexpathで

cellForIndexPath: 

合格/リサイクルセル。

ボタンを押すと、セルのivarからインデックスパスを読み取るだけです。

関連する問題