0

カスタムクラス(.hおよび.mファイル)で定義されたUITableViewにカスタムセルがあります。セルを表示し、リスト内の各セルのテキストを変更することはできますが、カスタム セルにはボタン (実際には 2 つ) もあります。ボタンをクリックすると、どの行のボタンがクリックされたかを知る必要があります。カスタムUIセルクラス内でこれを取得する方法はありますか?

私が求めていることが明確であることを願っています。そうでない場合は、お気軽にコメントしてください。できる限り説明します。

4

3 に答える 3

2

このアプローチを使用できます。

  1. 各ボタンに関連付けられたオブジェクトの値を設定します。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>
    
  2. アクション/ターゲットをビュー コントローラー (またはテーブル ビュー デリゲート) に設定します。

    [ myButton addTarget:<view controller> action:@selector( buttonTapped: ) forControlEvents:UIControlEventTouchUpInside ] ;
    
  3. アクションで、送信者に関連付けられたオブジェクトを確認します。送信者はあなたのUIButtonになります

    -(void)buttonTapped:(UIButton*)sender
    {
        // retrieve object associated with the tapped button:
        id associatedObject = sender.associatedObject ;
    }
    
于 2012-07-25T21:13:58.450 に答える
2

コメントするコードは表示されませんが、一般的に言えば、次のことができます。

  1. tagボタンが表示されるテーブル行を表す for each ボタンを定義します。

  2. 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 スレッドをご覧ください。

于 2012-07-25T21:14:38.133 に答える
0

これを行うにprotocolは、カスタム セル クラスの を作成し、カスタム セルのそれぞれのUIViewControllerを処理する をUITableView作成しdelegateます。

次に、それがどのセルであるか、またはどの情報に基づいて行動する必要があるかについての情報を使用してデリゲートを呼び出したカスタム セル クラスにを添付しUIButtonました。IBAction

だから私は次のようなものを設定しprotocolます:

@protocol CustomCellDelegate <NSObject>

- (void) cellButtonPressed:(NSDictionary *)stuffForDelegate;

@end

次に、 に実装cellButtonPressed:するときに、それがどのセルであるか、またはどの情報に基づいて行動する必要があるかを判断するViewControllerために使用します。stuffForDelegate

tagメソッドは問題ありませんが、飛び交うすべてのタグを処理するのは面倒なので、代わりにオブジェクトとプロトコルとデリゲートを使用することを好みます。

于 2012-07-25T21:32:41.010 に答える