我有一个带自定义单元格的UITableView。在每个UITableViewCell中,都有一个UIButton。我试图在点击按钮时找出按钮所在的单元格。为此,我做到了这一点:
- (IBAction)likeTap:(id)sender {
UIButton *senderButton = (UIButton *)sender;
UITableViewCell *buttonCell = (UITableViewCell *)[senderButton superview];
UITableView* table = (UITableView *)[buttonCell superview];
NSIndexPath *pathOfTheCell = [table indexPathForCell:buttonCell];
NSInteger rowOfTheCell = [pathOfTheCell row];
NSLog(@"rowofthecell %d", rowOfTheCell);
我认为这样可以正常工作,但是当调用indexPathForCell时,会抛出异常。
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UITableViewCell indexPathForCell:]: unrecognized selector sent to instance 0x756d650'
关于我做错了什么的任何想法? 谢谢!
答案 0 :(得分:6)
这是你的问题:
(UITableViewCell *)[senderButton superview]
应该是:
(UITableViewCell *)[[senderButton superview] superview]
因为按钮的超级视图不是单元格,所以是contentView是单元格的子视图。
答案 1 :(得分:2)
为什么不为cellForRowAtIndexPAth方法中的每个按钮设置标记:
button.tag = indexPath.row;
然后在你的方法中你有:
- (IBAction)likeTap:(id)sender {
NSLog(@"rowofthecell %d", button.tag);
}
答案 2 :(得分:2)
我使用自定义UITableViewCell,我也在ios7上崩溃
在ios 6上,它的工作就像一个魅力
UITableViewCell *cell=(UITableViewCell*)[[sender superview] superview];
UITableView *table=(UITableView*)[cell superview];
NSIndexPath *path=[[sender superview] indexPathForCell:cell];
在ios7上,此代码崩溃,
此代码适用于ios7,但我不明白为什么......
UITableViewCell *cell = (UITableViewCell*)[[sender superview] superview];
UITableView *table = [[(UITableView*)[cell superview] superview] superview];
NSIndexPath *path=[[sender superview] indexPathForCell:cell];
所以我使用edzio27回答。我在我的按钮上设置了一个标签。
答案 3 :(得分:1)
您可以按edzio27
的建议为每个按钮设置标记,也可以尝试使用introspection
,如下所示:
- (IBAction)likeTap:(UIButton *)sender {
UIButton *senderButton = (UIButton *)sender;
if ([senderButton.superView isKindOfClass:[UITableViewCell class]]) {
UITableViewCell *buttonCell = (UITableViewCell *)[senderButton superview];
if ([buttonCell.superView isKindOfClass:[UITablewView class]]) {
UITableView* table = (UITableView *)[buttonCell superview];
NSIndexPath *pathOfTheCell = [table indexPathForCell:buttonCell];
NSInteger rowOfTheCell = [pathOfTheCell row];
NSLog(@"rowofthecell %d", rowOfTheCell);
}
}
}