Ios 自定义UITableViewCell和UIButton:单击了哪个按钮?

Ios 自定义UITableViewCell和UIButton:单击了哪个按钮?,ios,uitableview,uibutton,Ios,Uitableview,Uibutton,我正在用最新的SDK和XCode 4.2开发一个iOS 4应用程序 我有一个带节的UITableView和自定义的UITableViewCell。每个单元格都有一个UIButton,所有这些按钮都有相同的UIControlEventTouchUpInside目标 这是我的代码: - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { s

我正在用最新的SDK和XCode 4.2开发一个iOS 4应用程序

我有一个带节的
UITableView
和自定义的
UITableViewCell
。每个单元格都有一个UIButton,所有这些按钮都有相同的
UIControlEventTouchUpInside
目标

这是我的代码:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString* cellIdentifier = @"CalendarCell";

    CalendarEventCell* cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];

    if (cell == nil)
    {
        NSArray* topLevelObjects =  [[NSBundle mainBundle] loadNibNamed:@"CalendarEventCell" owner:nil options:nil];

        for(id currentObject in topLevelObjects)
        {
            if ([currentObject isKindOfClass:[CalendarEventCell class]])
            {
                cell = (CalendarEventCell *)currentObject;
                [cell.addToCalendarButton addTarget:self action:@selector(addEventToiCal) forControlEvents:UIControlEventTouchUpInside];
                break;
            }
        }
    }
...
}

当用户触摸该按钮内部时,我如何知道单击的单元格位于哪个区域和行?在按钮上放置一个标记。例如:

CalendarEventCell* cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];

if (cell == nil)
{
    NSArray* topLevelObjects =  [[NSBundle mainBundle] loadNibNamed:@"CalendarEventCell" owner:nil options:nil];

    for(id currentObject in topLevelObjects)
    {
        if ([currentObject isKindOfClass:[CalendarEventCell class]])
        {
            cell = (CalendarEventCell *)currentObject;
            [cell.addToCalendarButton addTarget:self action:@selector(addEventToiCal) forControlEvents:UIControlEventTouchUpInside];
            break;
        }
    }
}
cell.addToCalendarButton.tag = ((indexPath.section & 0xFFFF) << 16) |
                               (indexPath.row & 0xFFFF);

将button的目标设置为单元格中的方法,而不是将目标设置为控制器本身,使用类似于
tappedButton:(UIButton*)button inCell:(UITableViewCell*)单元格的方法为单元格创建委派协议,并将控制器设置为单元格的委派。在目标方法中,调用该委托方法


然后,在控制器的委托方法实现中,您可以通过调用
UITableView
tableView:indexPathForCell:

将标签值分配给按钮,就像在
cellforrowatinexpath
方法中一样

  • cell.addToCalendarButton.tag=indexPath.row
  • 当您将方法添加到按钮时,也会发送发送者,所以像这样将方法分配给按钮

    [cell.addToCalendarButton addTarget:自我操作:@selector(AddEventToCale:)for ControlEvents:UIControlEventTouchUpInside]

  • 在您的方法中,像这样读取相关行

    -(iAction)附加说明:(id)发送方{ NSLog(“当前行为%d”,[sender tag]); }

  • 如果你现在想了解这一部分,那么就做这样的事情吧

    - (void)addEventToiCal:(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];
    
       NsLog("value of indePath.section %d ,indexPath.row %d",indexPath.section,indexPath.row);
    
    }
    
    在cellforRowAtIndexPath上指定方法,如下所示

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

    是一个优秀的解决方案,适用于iOS 5及以上版本。它是一个UITableViewCell子类,旨在子类化,用于将操作消息从单元格子视图转发到控制器。

    您可以为该按钮设置标记。通过使用该标记号,您可以找出单击了哪个按钮。请看这里:您还可以将该方法声明为
    -(void)addeventtical:(UIButton*)sender
    ,然后删除第一行。@Jack先生,我讨论过这样写的问题。因为你似乎支持这个想法,我更新了答案以反映你的建议。谢谢你的回答。我需要indexPath.section和indexPath.row.Tagging方法很简单,但伸缩性不太好,特别是在向单元格中添加更多控件时,这些控件必须在控制器中标识,并且在添加和删除行后需要更新标记。我已经多次看到它导致错误/问题。@VansFannel您可以使用以下内容对节和行进行编码:
    tag=((indexPath.section&0xFFFF)>16)&0xFFFF);行=(标记&0xFFFF)谢谢你的回答。我需要indexPath.section和indexPath.row。将section和row传递给
    tappedButton:
    方法比调用
    tableView:indexPathForCell:
    更容易,不是吗?然后您必须将单元格的
    NSIndexPath
    作为其ivar/属性—这也是可能的。但您不必要地复制了您必须另外维护的数据—在单元格死亡时释放数据,在添加或删除上述单元格时更新数据,等等。但是,如果您通过运行
    tableView:indexPathForCell:
    遇到性能问题,这是不可能的,您当然可以使用该“快捷方式”。
    [cell.addToCalendarButton addTarget:self action:@selector(addEventToiCal:event:)forControlEvents:UIControlEventTouchUpInside];