我已将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。上面的代码是众所周知的解决方案 自定义配件视图,但它证明是不可靠的。我还需要做些什么吗?
答案 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:方法。