0

我在 UITableView 中有一个自定义单元格,由自定义类(.h 和 .m 文件)定义。我能够显示单元格,并更改列表中每个单元格的文本,但我的自定义单元格中也有按钮(实际上是两个)。当我单击按钮时,我需要知道单击了哪一行的按钮。有没有办法在自定义 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代表按钮出现的表格行;

  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 thread

于 2012-07-25T21:14:38.133 回答
0

我通过protocol为自定义单元格类创建一个,然后为每个自定义单元格UIViewController处理UITableView这个来完成此操作delegate

然后我将 附加UIButtonIBAction自定义单元格类中的一个调用它的委托,并提供有关它是哪个单元格或我需要采取哪些信息的信息。

所以我会设置一个类似的protocol东西:

@protocol CustomCellDelegate <NSObject>

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

@end

然后,当我在 中实现cellButtonPressed:时,ViewController我会使用stuffForDelegate它来确定它是哪个单元格或我需要对哪些信息采取行动。

tag方法还可以,但我发现处理所有飞来飞去的标签很乏味,我更喜欢使用对象、协议和委托。

于 2012-07-25T21:32:41.010 回答