使用UIButton自定义UITableViewCell:单击了哪个按钮?

时间:2012-03-06 07:34:23

标签: ios uitableview uibutton

我正在使用最新的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;
            }
        }
    }
...
}

当用户触摸该按钮时,如何知道哪个部分和行是单击的单元格?

4 个答案:

答案 0 :(得分:6)

在按钮上放置一个标签。例如:

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);

您需要将选择器更改为@selector(addEventToiCal:)并将方法更新为-(void) addEventToiCal:(UIButton *)sender

然后,您可以向-addEventToiCal:

添加以下内容
if (!([sender isKindOfClass:[UIButton class]]))
    return;
NSUInteger section = ((sender.tag >> 16) & 0xFFFF);
NSUInteger row     = (sender.tag & 0xFFFF);
NSLog(@"Button in section %i on row %i was pressed.", section, row);

答案 1 :(得分:3)

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

然后在控制器的委托方法实现中,您可以通过调用NSIndexPath的{​​{1}}找到单元格的UITableView

答案 2 :(得分:2)

将标记值分配给按钮,如cellForRowAtIndexPath方法

中的那样
  1. cell.addToCalendarButton.tag=indexPath.row
  2. 当您向按钮添加方法时,也会发送发件人,因此请将方法指定给按钮。

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

  3. 在您的方法中,阅读相关的行

    - (IBAction)addEventToiCal:(id)sender {         NSLog(“当前行是%d”,[发送者标签]); }

  4. 如果您现在想了解该部分,那么indexPath会做这样的事情

    - (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];
    

答案 3 :(得分:0)

对于iOS 5及更高版本,

BNRXIBCell是一个出色的解决方案。它是一个UITableViewCell子类,用于子类化,将动作消息从单元子视图转发到控制器。