我在同一个 UINavigationController
上有两个不同的 UIViewControllers
。两者都包含一个tableview
。
如果点击第一个 View Controller 上的一个单元格,则插入第二个 Controller 。
如果第二个 Controller 中的一个单元格被推送,则第二个 Controller 的另一个实例被推送。
当使用后退按钮返回时,这一切都很完美。但是,当使用 iOS 7 的 interactivePopGestureRecognizer
时,从第二个 View 的一个实例移动到另一个实例会导致崩溃。
我有记录导航 Controller 事件和手势识别器启动的语句。
这是启动然后取消弹出手势时的输出:
Push <ViewController2: 0x15597f60>
Will show <ViewController2: 0x15597f60>
Did show <ViewController2: 0x15597f60>
Push <ViewController2: 0x15638b80>
Will show <ViewController2: 0x15638b80>
Did show <ViewController2: 0x15638b80>
Interactive pop started
Will show <ViewController2: 0x15597f60>
-navigationController:didShowViewController:animated:
永远不会被调用。此后,再次尝试该手势将使您返回到第一个 View Controller (即弹出太多次),但导航栏仍将显示后退按钮和第二个 View 的标题。
然后这是尝试正常弹出时的输出:
Push <ViewController2: 0x15597f60>
Will show <ViewController2: 0x15597f60>
Did show <ViewController2: 0x15597f60>
Push <ViewController2: 0x15638b80>
Will show <ViewController2: 0x15638b80>
Did show <ViewController2: 0x15638b80>
Interactive pop started
Will show <ViewController2: 0x15597f60>
Unbalanced calls to begin/end appearance transitions for <ViewController1: 0x156e7050>.
Did show <ViewController1: 0x156e7050>
关于为什么会发生这种情况有什么想法吗?
最佳答案
问题是导航栏被隐藏。如果启用导航栏,问题就会消失。这绝对是苹果实现中的一个错误。当我悬赏它时找到了正确的答案。哎呀。
有关更多信息和可能的修复,请参阅此内容:https://stackoverflow.com/a/19834167/505259
更新: 丹尼斯的解决方法对我不起作用。我现在正在研究的一种解决方法是永远不要触摸 InteractivePopGestureRecognizer 的委托(delegate)。不要管它。我建议保持导航栏处于事件状态但隐藏(不使用隐藏属性,可能通过手动隐藏 subview 或将导航栏层重新排序到后面)。
第二次更新: 您可以保留对当前 InteractivePopGestureRecognizer 委托(delegate)的引用(这是您不应该触摸的一些私有(private)对象)。然后,当您将委托(delegate)设置为您自己的自定义实现时,将委托(delegate)方法调用传递回原始私有(private)对象。这应该可以完全解决问题。
关于ios - InteractivePopGestureRecognizer 弹出太多 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20887956/