【发布时间】:2017-12-07 03:16:06
【问题描述】:
假设,我有 3 个视图控制器:A、B、C,都嵌入到导航控制器中。 A 和 B 有导航栏,C 没有。
我在B 和C 之间有一个自定义的交互过渡。由于我需要我的导航栏在C 上消失,所以我实现了UINavigationControllerDelegate 的这个功能:
func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) {
if viewController is C {
navigationController.setNavigationBarHidden(true, animated: animated)
}
else {
navigationController.setNavigationBarHidden(false, animated: animated)
}
}
在一个常见的场景中,一切都很完美,当我只进行推-弹出转换时。
但是当我通过在UIPercentDrivenInteractiveTransition 上调用cancel() 来取消转换B->C 时,导航栏不会显示在B 上。在这里我必须打电话给setNavigationBarHidden(false, ...),但我还没有找到正确的地方来做这件事。
如果我在B 的viewWillAppear 中调用它,导航栏会出现,但看起来很奇怪——它包含C 如果有导航栏就会有的元素。如果我弹回A,它会闪烁一会儿,显示预期的内容,但在转换后A 导航栏立即被B 导航栏取代!
因此,似乎导航栏堆栈在B->C 转换取消后以某种方式损坏,它似乎相对于视图控制器进行了这样的移动:
has
-----------------------------------------------
| ViewController | Navigation bar of |
-----------------------------------------------
| A | B |
-----------------------------------------------
| B | C |
-----------------------------------------------
那么,我的问题是在这种情况下调用navigationController.setNavigationBarHidden(false, animated: true) 的正确位置是什么?
【问题讨论】:
标签: ios iphone swift uinavigationcontroller uinavigationbar