每行UITableView的button

我有一个自定义单元格在一个自定义类(.h和.m文件)定义的UITableView中。 我能够显示单元格,并更改列表中的每个单元格的文本,但我的自定义单元格中也有button(实际上是两个)。 当我点击button时,我需要知道哪一行的button已被点击。 有没有什么办法可以在自定义的ui单元类中获取?

我希望我所要求的是明确的。 如果没有,请随时发表评论,我会尽力解释。

您不会显示任何代码进行评论,但一般而言,您可以:

  1. 为每个button定义一个tag ,代表button出现的表格行;

  2. 当你的button操作方法被调用时,你可以访问button的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; } 

为了更详细的解决scheme,看看这个SO线程 。

你可以使用这种方法:

  1. 用每个button设置一个关联的对象值。 你可以通过向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 ; } 

我已经通过创build自定义单元类的protocol ,然后使UIViewController处理UITableView每个自定义单元的delegate来完成此操作。

然后,我将UIButton附加到自定义单元类中的IBAction ,该类调用它的委托,以获取有关哪个单元格或哪些信息需要采取行动的信息。

所以我会build立一个类似这样的protocol

 @protocol CustomCellDelegate <NSObject> - (void) cellButtonPressed:(NSDictionary *)stuffForDelegate; @end 

然后当我实现cellButtonPressed:ViewController我会使用stuffForDelegate来确定它是哪个单元格或需要采取什么行动。

tag方法是可以的,但是我发现处理所有标签的繁琐工作,我更喜欢使用对象和协议,而不是使用代理。