tableView:indexPath *总是返回一个nil IndexPath

时间:2013-11-03 05:43:38

标签: ios objective-c uitableview ios7 uigesturerecognizer

我正在处理我正在处理的应用中的表格单元格上设置长按手势的问题。我已经尝试了三种不同的配置,但尚未成功完成。

情景1)

我在自定义UILongPressGestureRecognizer类中添加了UITableViewCell,并且正在处理属于自定义单元格类的操作中的操作(显示操作表)。这工作但是引入了链接单元格渲染的对象的必要性,然后让我无法更新表格数据源(操作表用于删除项目)所以尽管UIActionSheet设置工作正常但我放弃了这一点。

情景2)

UILongPressGestureRecognizer添加到表视图中,但是由包含表视图的控制器处理它的操作(我使用的是通用UITableView)。在手势识别器的操作中,我尝试过:

if (sender.state == UIGestureRecognizerStateBegan) {
    CGPoint point = [sender locationInView:self.tableView];
    NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:point];

    if (indexPath == nil)
        return;

    // Fetch item from index path and show action sheet
}

这在考试if (indexPath == nil)失败了。

情景3)

我找到了一个例子,在每个单元格创建时添加UILongPressGestureRecognizer,并在包含表格视图的控制器中使用相同的处理程序。然后我将上述测试改为:

if (sender.state == UIGestureRecognizerStateBegan) {
    NSIndexPath *indexPath = [self.tableView indexPathForCell:(MyCustomCell *)[sender view]];

    if (indexPath == nil)
        return;

    // Fetch item from index path and show action sheet
}

同样,这在测试if (indexPath == nil)时仍然失败。

我是否必须在表视图上执行某些操作才能获取索引路径,或者我是否在错误的位置执行这些检查?是否有更好的方法来添加(最好是不可见的)显示删除确认的方法?

修改

添加其他信息以回应@ Joel的评论。

以下是模拟器中加载的问题:http://grab.by/rHTA

为了提供一些视觉信息,视图中的选定行(从顶部开始的第3个)是我将对以下日志的上下文执行长按手势的行。

2013-11-03 10:42:08.434 Application[35392:70b] Long press point = (143.000000, 168.000000)
2013-11-03 10:42:08.434 Application[35392:70b] IndexPath is nil

正如您可以看到的日志"IndexPath is nil"仅在indexPath == nil求值为true时打印,表视图未返回该点的索引路径。该点在表格框架内有效。

这是使用我为场景2列出的相同设置执行的。

1 个答案:

答案 0 :(得分:2)

我正在回答这个问题,因为它解决了我的问题。

我很抱歉让所有人都知道这个问题,但事实证明核心问题是未能将表格视图链接到我最初做过的视图控制器中的IBOutlet,但必须在尝试时意外删除实施这个长期印刷问题。

将链接添加回视图控制器,以便self.tableView不再是nil本身,我开始获得准确的结果。

我为之前没有验证过这样的简单事情而道歉,并且将来会留意它们。感谢@Joel和@rdelmar试图让我走上正轨,但正如你们所说的那样,每个场景都应该正常工作(并且确实如此),只要其他所有内容都相应地设置。