カスタムクラス(.hおよび.mファイル)で定義されたUITableViewにカスタムセルがあります。セルを表示し、リスト内の各セルのテキストを変更することはできますが、カスタム セルにはボタン (実際には 2 つ) もあります。ボタンをクリックすると、どの行のボタンがクリックされたかを知る必要があります。カスタムUIセルクラス内でこれを取得する方法はありますか?
私が求めていることが明確であることを願っています。そうでない場合は、お気軽にコメントしてください。できる限り説明します。
カスタムクラス(.hおよび.mファイル)で定義されたUITableViewにカスタムセルがあります。セルを表示し、リスト内の各セルのテキストを変更することはできますが、カスタム セルにはボタン (実際には 2 つ) もあります。ボタンをクリックすると、どの行のボタンがクリックされたかを知る必要があります。カスタムUIセルクラス内でこれを取得する方法はありますか?
私が求めていることが明確であることを願っています。そうでない場合は、お気軽にコメントしてください。できる限り説明します。
このアプローチを使用できます。
各ボタンに関連付けられたオブジェクトの値を設定します。UIButton にカテゴリを追加することでこれをサポートできます
@interface UIButton (AssociatedObject)
@property ( nonatomic, retain ) id associatedObject ;
@end
実装:
@implementation UIButton (AssociatedObject)
-(void)setAssociatedObject:(id)object
{
objc_setAssociatedObject( self, @"_associatedObject", object, OBJC_ASSOCIATION_RETAIN_NONATOMIC ) ;
}
-(id)associatedObject
{
return objc_getAssociatedObject( self, @"_associatedObject" ) ;
}
@end
これを次のように使用します。
myButton.associatedObject = <some object>
アクション/ターゲットをビュー コントローラー (またはテーブル ビュー デリゲート) に設定します。
[ myButton addTarget:<view controller> action:@selector( buttonTapped: ) forControlEvents:UIControlEventTouchUpInside ] ;
アクションで、送信者に関連付けられたオブジェクトを確認します。送信者はあなたのUIButtonになります
-(void)buttonTapped:(UIButton*)sender
{
// retrieve object associated with the tapped button:
id associatedObject = sender.associatedObject ;
}
コメントするコードは表示されませんが、一般的に言えば、次のことができます。
tag
ボタンが表示されるテーブル行を表す for each ボタンを定義します。
tag
ボタンアクションメソッドが呼び出されると、ボタンのプロパティにアクセスして、それがどの行であったかを知ることができます。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];
if (cell == nil) {
...
}
...
[button setTag:indexPath.row];
...
}
- (void)buttonPressedAction:(id)sender
{
UIButton *button = (UIButton *)sender;
int row = button.tag;
}
より複雑な解決策については、この SO スレッドをご覧ください。
これを行うにprotocol
は、カスタム セル クラスの を作成し、カスタム セルのそれぞれのUIViewController
を処理する をUITableView
作成しdelegate
ます。
次に、それがどのセルであるか、またはどの情報に基づいて行動する必要があるかについての情報を使用してデリゲートを呼び出したカスタム セル クラスにを添付しUIButton
ました。IBAction
だから私は次のようなものを設定しprotocol
ます:
@protocol CustomCellDelegate <NSObject>
- (void) cellButtonPressed:(NSDictionary *)stuffForDelegate;
@end
次に、 に実装cellButtonPressed:
するときに、それがどのセルであるか、またはどの情報に基づいて行動する必要があるかを判断するViewController
ために使用します。stuffForDelegate
tag
メソッドは問題ありませんが、飛び交うすべてのタグを処理するのは面倒なので、代わりにオブジェクトとプロトコルとデリゲートを使用することを好みます。