在我正在开发的一个应用程序中,在桌面单元格上设置一个长新闻手势时,我遇到了一些问题。我已经尝试了三种不同的配置,但还没有得到一个成功的工作。
(设想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 is nil"才会被打印为indexPath == nil。这一点在表框架内是有效的。
这是用我为场景2列出的相同的设置执行的。
发布于 2013-11-03 16:57:09
我之所以这样回答是因为它解决了我的问题。
我很抱歉让每个人都知道这个问题,但事实证明,核心问题是未能将表视图链接到视图控制器中的IBOutlet中,这一点我最初做过,但在实现这个冗长的新闻问题时,它一定是意外删除的。
将链接添加回视图控制器,使self.tableView不再是nil本身,我开始获得准确的结果。
我很抱歉以前没能证实这样简单的事情,以后也会注意到的。感谢@Joel和@rdelmar试图让我走上正确的轨道,但正如你们都说的,只要其他一切都相应地设置,每个场景都应该工作(而且确实会)。
https://stackoverflow.com/questions/19750192
复制相似问题