我目前有一个UITableView,其中填充了一个单独的nib中的自定义UITableViewCell。在单元格中,有两个按钮连接到自定义单元类中的操作。当我单击其中一个按钮时,我可以调用正确的方法,但我需要知道按下哪一行按钮。每个按钮的标签属性为0.我不需要知道整个单元格的时间选中,就在按下某个特定按钮的时候,所以我需要知道它是哪一行,这样我才能更新正确的对象。
答案 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)
有多种方法可以解决问题。
然后在按钮功能中,您可以轻松访问标记值,它将成为单击按钮的索引。
-(void)btnClicked:(id)sender
{
int index = [sender tag];
}
您可以使用图层属性 将indexPath添加为图层字典中的值。
[[btn layer] setValue:indexPath forKey:@“indexPath”];
可以从按钮动作功能访问此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);
}