2011-12-13 9 views
2

私はTableViewCellにUIButtonsを埋め込んでいます。ボタンが属するセルをトラッキングするために、UIButtonにNSIndexPathプロパティを追加したいと思います。私はUIButtonをサブクラス化したくありません。カテゴリでこれを行う方法はありますか?サブクラス化せずにUIControlsにプロパティを追加する

編集:テーブルビューに複数のセクションがある場合、タグを設定するというアイデアはうまくいかないと思います。ボタンのスーパービューのスーパービューにアクセスしてセルを判断するもう1つの方法は、ハックのように思えます。これを行うよりクリーンな方法を探しています。

答えて

4

いくつかのアプローチがあります。完全なインデックスパスではなく単一の番号が必要な場合は、setTag:を使用できます。柔軟性はありませんが、すぐに利用できます。

次善策はassociative referencesです。これらは、適切なメモリ管理を使用して、任意のオブジェクトにデータをハングアップさせることができます。私は通常、objc_setAssociatedObjectobjc_getAssociatedObjectを使って実装されたプロパティを追加するカテゴリを作成します。

4

タグまたはインデックスパスをボタンに関連付けることなく、クリックされたボタンがどのセルにあるかを知ることができます。これは、セルを再利用すると乱雑になります。タグはセクション化されたテーブルで動作しますが、数字を混乱させる必要があります。 10001はセクション1の行1なので、一方の端で変換し、もう一方の端で変換しなければならない、私の好みのために壊れやすい。

より良い方法は、UITableViewのindexPathForRowAtPoint:メソッドを使用することです。あなたのボタンのアクションが起動されると(ターゲットはあなたのテーブルビューコントローラであると仮定すると:

CGPoint point = [sender convertPoint:sender.center toView:self.tableView]; 
NSIndexPath *path = [self.tableView indexPathForRowAtPoint:point]; 

senderここUIButtonにキャストされ

1

ためにボタンが

に属するセルを追跡します。

ボタンが属するセルは既にわかっています。ボタンがサブビューのセルです。

  1. ボタンを参照して開始します。 (の場合、これはselfです。ボタンがタップされ、アクションメッセージが送信されると、そのメッセージはパラメータとしてアクションメッセージ(通常はsender)に渡されます。 。

  2. ビュー階層(superview)を検索して、ボタンを含むUIViewTableCellを見つけます。

    UIView* v = theButton; 
    while (![v isKindOfClass: [UITableViewCell class]]) v = v.superview; 
    
  3. これで、あなたはその情報で好きなことをすることができます。たとえば、NSIndexPathが必要なようです。 -[UITableView indexPathForCell:]に電話してください。

関連する問題