每行UITableView的按钮

时间:2012-07-25 21:10:21

标签: objective-c ios uitableview

我在UITableView中有一个自定义单元格,由自定义类(.h和.m文件)定义。我能够显示单元格,并更改列表中每个单元格的文本,但我的自定义单元格中也有按钮(实际上是两个)。当我单击按钮时,我需要知道单击了哪一行按钮。有没有办法在自定义ui单元类中获得这个?

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

3 个答案:

答案 0 :(得分: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 ;
    }
    

答案 1 :(得分: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;
       }
    
  3. 有关更详细的解决方案,请查看this S.O. thread

答案 2 :(得分:0)

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

然后我将UIButton附加到自定义单元格类中的IBAction,该类调用了它的委托,其中包含有关哪个单元格或我需要处理哪些信息的信息。

所以我会设置protocol,例如:

@protocol CustomCellDelegate <NSObject>

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

@end

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

tag方法没问题,但是我觉得处理所有标记很乏味,我更喜欢使用对象和协议以及代理。