iPhone - 如何确定在自定义UITableViewCell中按下按钮的单元格

时间:2009-06-22 22:24:28

标签: iphone uitableview uibutton

我目前有一个UITableView,其中填充了一个单独的nib中的自定义UITableViewCell。在单元格中,有两个按钮连接到自定义单元类中的操作。当我单击其中一个按钮时,我可以调用正确的方法,但我需要知道按下哪一行按钮。每个按钮的标签属性为0.我不需要知道整个单元格的时间选中,就在按下某个特定按钮的时候,所以我需要知道它是哪一行,这样我才能更新正确的对象。

10 个答案:

答案 0 :(得分:19)

更简单的解决方案是使用(id)发件人定义您的按钮回调,并使用它来挖掘表行索引。这是一些示例代码:

- (IBAction)buttonWasPressed:(id)sender
{
    NSIndexPath *indexPath =
        [self.myTableView
         indexPathForCell:(UITableViewCell *)[[sender superview] superview]];
    NSUInteger row = indexPath.row;

    // Do something with row index
}

很可能你使用相同的行索引来创建/填充单元格,因此识别按钮现在应该做什么应该是微不足道的。无需使用标签并尝试将它们整理好!

澄清:如果您目前使用 - (IBAction)buttonWasPressed; 只是将其重新定义为 - (IBAction)buttonWasPressed:(id)sender; 附加的回调参数在那里,无需做任何额外的事情来获得它。还记得在Interface Builder中将按钮重新连接到新的回调!

答案 1 :(得分:10)

您可以使用按钮上的tag属性指定创建按钮的行,如果您没有使用其他任何标记。

答案 2 :(得分:5)

对于不依赖于标签或视图层次结构的实现,请执行以下操作

- (void)btnPressed:(id)sender event:(id)event
{
  UITouch *touch = [[event allTouches] anyObject];
  CGPoint touchPoint = [touch locationInView:self.tableView];
  NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:touchPoint];
}

答案 3 :(得分:4)

我有同样的情况。为此,我派生了一个自定义单元格。我添加了两个属性,section和row。我还添加了一个所有者,这将是我派生的TableViewController类。当要求单元格时,我会根据indexPath和所有者设置section / row。

cell.section = indexPath.section cell.row = indexPath.row cell.owner = self

我做的下一件事是当我创建按钮时,我将按钮事件与单元格相关联,而不是与tableViewController相关联。事件处理程序可以读取节和行条目,并将适当的消息(或事件)发送到TableViewController。这通过利用现有方法和内务管理以及尽可能保持单元格自我包含,极大地简化了房屋维护和维护。由于系统已经跟踪了细胞,为什么要两次呢!

答案 4 :(得分:3)

更容易:

-(IBAction) buttonPressed {
    NSIndexPath *myIndexPath = [(UITableView *)self.superview indexPathForCell: self];
    // do whatever you need to do with the information
}

答案 5 :(得分:3)

这是一个Swift示例......

UIControl类是各种iOS小部件的超类,包括UIButton,因为UIControl提供了发送事件通知的目标/动作机制。因此,处理此问题的一般方法如下:

func actionHandler(control: UIControl)
   var indexPath = tableView.indexPathForCell(control.superview!.superview! as UITableViewCell)!
   var row = indexPath.row
}

以下是设置按钮控件以执行操作的示例。或者,创建一个@IBAction并使用Interface Builder直观地创建操作。

button.addTarget(self, action: "actionHandler:", forControlEvents: .TouchUpInside)

您可以根据需要将UIControl参数向下转换为UIButton,UIStepper等。例如:

var button = control as UIButton

控件的超级视图是UITableViewCell的contentView,其子视图是单元格中显示的UIViews(UIControl是UIView的子类)。内容单元的超级视图是UITableViewCell本身。这就是为什么这是一个可靠的机制,超级视图可以不受惩罚地进行。

答案 6 :(得分:1)

您可以访问按钮superview以获取包含您的按钮的UITableViewCell,但如果您只需要行号,则可以使用tag属性,例如之前的帖子deacribes

答案 7 :(得分:1)

有多种方法可以解决问题。

  1. 您可以使用“tag”属性 将值indexPath.row作为按钮的标记值 btn.tag = indexPath.row;
  2. 然后在按钮功能中,您可以轻松访问标记值,它将成为单击按钮的索引。

    -(void)btnClicked:(id)sender
    {
        int index = [sender tag];
    }
    
    1. 您可以使用图层属性 将indexPath添加为图层字典中的值。

      [[btn layer] setValue:indexPath forKey:@“indexPath”];

    2. 可以从按钮动作功能访问此indexPath。

      -(void)btnClicked:(id)sender
      {
          NSIndexPath *indexPath = [[sender layer] valueForKey:@"indexPath"];
          int index = indexPath.row;
      }
      

      使用此方法,只需在字典中使用不同的键添加新对象,就可以将多个值传递给按钮功能。

答案 8 :(得分:0)

    [btnFavroite setAccessibilityValue:[NSString stringWithFormat:@"%d",indexPath.row]];
    [btnFavroite setAccessibilityLabel:btnFavroite.titleLabel.text];
    [btnFavroite addTarget:self action:@selector(btnFavClick:) forControlEvents:UIControlEventTouchUpInside];

-(void)btnFavClick:(id)sender{
    UIButton *btn=(UIButton *)sender;
    int index=[btn.accessibilityValue integerValue]]
}

答案 9 :(得分:0)

此解决方案也适用于使用故事板单元原型连接的IBAction

- (IBAction)viewMapPostsMarker:(UIButton*)sender{
    // button > cellContentView > cellScrollView > cell
    UITableViewCell *cell = (UITableViewCell *) sender.superview.superview.superview; 
    NSIndexPath *index = [self.mapPostsView indexPathForCell:cell];
    NSLog(@" cell at index %d",index.row);
}