调用indexPathForCell时崩溃

时间:2013-06-30 06:49:16

标签: ios exception uitableview

我有一个带自定义单元格的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'

关于我做错了什么的任何想法? 谢谢!

4 个答案:

答案 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);
        }
    }           
}