2

在我正在开发的应用程序的表格单元格上设置长按手势时,我遇到了一些问题。我尝试了三种不同的配置,但还没有一种可以成功运行。

场景 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我发现了一个在创建每个单元格时添加 a 的示例,并且在包含表格视图的控制器中仍然使用相同的处理程序时这样做。然后我将上述测试更改为:

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 列出的相同设置执行的。

4

1 回答 1

2

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

我很抱歉让每个人都回答这个问题,但事实证明,核心问题是未能将表视图链接到IBOutlet视图控制器中,我最初这样做但在尝试实现这个长按问题时必须意外删除。

将链接添加回视图控制器,这样self.tableView就不再是nil它本身了,我开始得到准确的结果。

对于之前未能验证此类简单的事情,我深表歉意,并且将来会注意它们。感谢@Joel 和@rdelmar 试图让我走上正轨,但正如你们俩所说,只要其他一切都相应地设置,每个场景都应该工作(并且确实)。

于 2013-11-03T16:57:09.757 回答