我创建了一个用自定义UITableViewCell(like this)填充的表视图。每个单元格包含两个UIButton。我将动作分配给按钮,如下所示:
[decreaseButton addTarget:self action:@selector(decrease) forControlEvents:UIControlEventTouchUpInside];
这是正确的方法吗? 无论如何,它有效,但在我的“减少”方法中,我需要知道按下按钮的18个表视图行中的哪一行。当然,indexPath.row在cellForRowAtIndexPath方法之外不起作用。 有人能解释我怎么做吗?
提前多多感谢!
iYassin
答案 0 :(得分:3)
你可以用两种方式做到这一点。
检查事件发件人
更改您的减少方法:
- (void)decrease;
为:
- (void)decrease:(id)sender;
这样当调用减少时,您将获得对事件内部触摸的按钮的引用。
定义减少方法更接近信息
另一个解决方案是为每个按钮设置不同的目标实例(例如,将减少功能实现为自定义单元格的一部分)。这样你知道触摸的按钮是当前单元格的按钮。
答案 1 :(得分:1)
我解决这个问题的方法是跟踪我自定义单元格对象中可能需要的数据。按钮不是连接到外部接收器,而是连接到自身的单元,而单元又知道如何调用动作的真实接收器。
我用类似的东西制作我的手机:
cell = [[MyTableViewCell alloc] initWithStyle:style
reuseIdentifier:CellIdentifier];
我有一个设置方法,所以当我出列时我可以重新启动一个单元格:
[cell setupMyCellWithContext:objectID
target:[[UIApplication sharedApplication] delegate]
action:@selector(someAction)];
所以在你的单元格类中你使用在setup方法中发送的动作和目标来调用真正的目标:
- (void)doAction:(id)sender {
if ([target respondsToSelector:action]) {
[target performSelector:action withObject:objectID afterDelay:0];
}
}
因此,当您的用户点击按钮时,操作系统会调用[cell doAction:],它会使用正确的上下文对象调用您之前设置的目标和操作选择器。