【发布时间】:2014-06-22 10:53:09
【问题描述】:
如果拖动UIViewController 的边缘以在UINavigationController 内开始交互式弹出过渡,则当前下方的UIViewController 将调用viewWillAppear:,然后调用UINavigationControllerDelegate 方法navigationController:willShowViewController:animated:。
如果您取消转换(即被拖动的控制器被放回原来的位置而不是弹出),viewWillAppear: 和 viewDidAppear: 将按预期在顶视图控制器上调用,但委托方法 navigationController:willShowViewController:animated: 和 @ 987654330@ 不是。考虑到调用了UIViewController 视图生命周期方法,似乎至少应该调用其中一个或两个。我想知道这是故意的还是UINavigationController 中的错误。
我真正需要的是能够在我的UINavigationController 子类或其UINavigationControllerDelegate 中看到何时取消交互式弹出。有没有明显的方法可以做到这一点?
编辑
我仍在寻找解决方案,但想提一下,我已将此问题报告为 Apple 的错误。查看文档,没有理由不调用这些委托方法,尤其是考虑到等效的视图生命周期方法确实会被调用。
edit2
我的雷达票 (16823313) 今天(2015 年 5 月 21 日)关闭并标记为预期。 :(
工程部门已确定此问题的行为符合预期 关于以下信息:
这实际上是正确的行为。导航过渡 这是从 B -> A 发生的,如果你在过渡中取消它,你 不会得到 didShowViewController: 方法。取消这个 过渡不应被视为从 A -> B 的过渡,因为 你从未真正到达过 A。
view[Will/Did]Appear 仍应按预期调用。
这种情况真是太糟糕了,因为它违反直觉,但我下面答案中的解决方法在可预见的未来应该可以正常工作,至少对于我的用例而言。
【问题讨论】:
-
你有我可以欺骗的错误报告编号吗?
-
嗨蒂姆。我的错误报告编号是
16823313。去年 6 月,他们尝试使用第一个 iOS 8 测试版将其标记为已修复,我在确认它仍然损坏后将其打开。此后没有任何活动。 -
为什么第 1 段说 navigationController:willShowViewController: 被调用,而第 3 段却说没有被调用?
-
@malhal 方法会在您启动交互式弹出时调用,但不会在您取消时调用。
-
谢谢,我现在明白了,希望你不介意我编辑了这个问题,将第 2 段和第 3 段结合起来,因为他们谈论的是同一个案例。我仍在弄清楚我对这个问题的回答,但只是为了让你知道在取消手势后我确实接到了 willShowViewController 的电话(Xcode 11.1 iPhone 8 Plus 模拟器肖像)。
标签: ios objective-c uinavigationcontroller uikit