自定义UITableViewCell和IBAction

时间:2010-11-05 04:42:46

标签: uitableview ibaction

我有一个自定义的UITableViewCell,我在其上添加了一个按钮,我在viewController中的IBAction上关联了该按钮。现在我遇到的问题是如何知道该按钮的创建单元格。当我提出我的viewController,其中有一个表并且有多行(自定义UITableViewCell),现在当用户按下按钮时,操作被调用,但我怎么知道它是哪一行。

因为基于行索引我需要存储一些值。

编辑:我现在有一些线索,但我仍然不确定我该怎么做,所以看起来像我的tableViewController cellForRowAtIndexPath方法我必须做这样的事情

[cell.button1 addTarget:self action:@selector(addToCart:) forControlEvents:UIControlEventTouchUpInside];

然后我必须写一个方法

-(IBAction) addToCart:(id) sender

但我还不知道如何在addToCart方法中获取行索引。 感谢您的帮助。

4 个答案:

答案 0 :(得分:20)

好的,最后我得到了答案,查看不同的论坛,人们建议做这样的事情

在cellForRowAtIndexPath中的自定义表视图控制器中执行此操作

cell.addToCart.tag = indexPath.row;
[cell.addToCart addTarget:self action:@selector(addToCart:)    
                               forControlEvents:UIControlEventTouchUpInside];

其中addToCart是我的customUITableViewCell中UIButton的名称。它似乎对我不起作用。所以这就是我做的事情

-(IBAction) addToCart:(id) sender{
        NSIndexPath *indexPath = [self.tableView indexPathForCell:(UITableViewCell *)
                    [[sender superview] superview]];
    NSLog(@"The row id is %d",  indexPath.row); 
 }

然后通过interfacebuilder我将我的按钮的动作关联到我的表视图控制器上的addToCart IBAction。

答案 1 :(得分:5)

更少黑客。

[cell.button1 addTarget:self action:@selector(addToCart:event:) forControlEvents:UIControlEventTouchUpInside];


- (void)addToCart:(id)sender event:(id)event
{
    NSSet *touches = [event allTouches];
    UITouch *touch = [touches anyObject];
    CGPoint currentTouchPosition = [touch locationInView:self.tableView];
    NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint: currentTouchPosition];

}

答案 2 :(得分:4)

接受的答案不再适用。请参阅this帖子

就是那样:

- (void)checkButtonTapped:(id)sender
{
    CGPoint buttonPosition = [sender convertPoint:CGPointZero toView:self.tableView];
    NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:buttonPosition];
    if (indexPath != nil)
    {
     ...
    }
}

答案 3 :(得分:0)

许多开发人员使用自定义视图在旧版iOS上的Table视图中显示自定义单元格。如果您是其中之一,那么您将不得不面对一个问题,即您的按钮点击操作将不再适用于iOS7。

如何解决此问题:

您有两种选择:

选项1 :使用新的表格单元格而不是视图来创建新的布局。并将所有布局再次放入表格单元格中。

我知道,这需要付出很多努力。如果你不想这样做,我们会有一个非常小的黑客:选项2

选项2 :为您的按钮创建一个IBOutlet,并将此按钮添加为您单元格内容视图的子视图。

[self.myCell.contentView addSubview:self.btn_click];

上面的代码行将添加btn_click作为内容视图的子视图。现在按钮点击操作应该有效。