在我正在开发的应用程序的表格单元格上设置长按手势时,我遇到了一些问题。我尝试了三种不同的配置,但还没有一种可以成功运行。
场景 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 列出的相同设置执行的。