自定义配件视图按钮 - 选择了错误的行

时间:2011-06-03 13:43:12

标签: iphone

我已将UITableViewCell的附件视图实现为按钮 按钮的选择器方法我有以下代码

   - (UIButton *) makeDetailDisclosureButton
   {
       UIButton * button = [UIButton buttonWithType:UIButtonTypeCustom];
   UIImage* image = [UIImage imageNamed:@"custom.png"];
  [button setImage:image forState:UIControlStateNormal];
  button.frame = CGRectMake(0.0, 0.0, image.size.width, image.size.height);

   [button addTarget: self
           action: @selector(accessoryButtonTapped:withEvent:)
         forControlEvents: UIControlEventTouchUpInside];

      return ( button );
    }


  - (void) accessoryButtonTapped: (UIControl *)button withEvent:(UIEvent *) event
   {
       NSSet *touches = [event allTouches];
   UITouch *touch = [touches anyObject];
   CGPoint currentTouchPosition = [touch locationInView:self.tableView];
   NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:currentTouchPosition];
   if (indexPath != nil)
   {
    [self tableView: self.tableView accessoryButtonTappedForRowWithIndexPath: indexPath];
  }
}

然而,有时会选择错误的行,即如果我点击表格中的第0行,我会得到 实际上选择了行= 1。上面的代码是众所周知的解决方案 自定义配件视图,但它证明是不可靠的。我还需要做些什么吗?

4 个答案:

答案 0 :(得分:4)

试试这个,

- (void) accessoryButtonTapped: (UIControl *)button withEvent:(UIEvent *) event
{
    UITableViewCell *cell = (UITableViewCell*)button.superview.superview;
    NSIndexPath *indexPath = [self.tableView indexPathForCell:cell]; 
    [self tableView:self.tableView accessoryButtonTappedForRowWithIndexPath:indexPath];
}

这里的想法很基本。按钮的超级视图应该给我cell.contentView,它的超级视图是cell。有一个可爱的帮助方法indexPathForCell:,它将为我们提供索引路径,我们可以使用它来传递给委托方法。

答案 1 :(得分:1)

您的代码中没有出现任何错误,但您可以参考this tutorial作为参考。

我在您的代码和教程中看到的差异是

 - (void) accessoryButtonTapped: (UIControl *)button withEvent:(UIEvent *) event //Your event
 - (void)checkButtonTapped:(id)sender event:(id)event //In tutorial.

这没有什么不同,但仍然只是一个想法。

希望它有所帮助。

答案 2 :(得分:0)

tableView:accessoryButtonTappedForRowWithIndexPath:
方法有什么用?

无论如何,我不会搞砸索引路径。

相反,我会使用[indexPath行]标记按钮,然后将标记传递给另一个方法。

答案 3 :(得分:-1)

我遇到了类似的问题:tableView:accessoryButtonTappedForRowWithIndexPath:中的索引路径行一直是错误的 - 在我的例子中 - 表视图的每第5行。

例如,点击第4行的详细信息披露按钮正确地给了我indexPath.row = 3;但是点击第5行给了我indexPath.row = 3。

我的错误与为自定义UITableViewCell设置不兼容的行高有关。

即,我在UITableViewCell的Size Inspector中将自定义行高设置为56,但我忘了我之前在tableView中以编程方式设置行高:heightForRowAtIndexPath:作为tableView.rowHeight的倍数。默认的tableView.rowHeight(在UITableView的Size Inspector中可编辑)是44,而''冲突'显然导致了这个问题。

我通过在UITableView&的尺寸检查器中将行高字段设置为56来解决了我的问题。 UITableViewCell并注释掉tableView:heightForRowAtIndexPath:方法。