导航控制器是App中常用的一种控制器,但是系统提供的UINavigationController
并不完善,下面举两个例子以及对应的改善方案。
- 当隐藏
NavigationBar
或者自定义back BarButtonItem
时,边界滑动返回的功能失效。
解决方案:自定义
UINavigationController
的子类,或者使用root view controller
作为代理,实现UINavigationControllerDelegate
的gestureRecognizerShouldBegin()
方法,当子控制器数量大于1时,返回true
。
func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
if viewControllers.count > 1 {
return true
}
return false
}
- 当快速点击两个按钮,分别启动
pop view controller
和push view controller
操作时,系统会把两个动作依次完成,可能会导致控制器栈顺序错乱。
解决方案:如果App有controller正在push或者pop,禁止启动第二次push和pop操作,或者加入队列中,等前一次动画结束再启动下一个操作,同时禁用手势操作
interactivePopGestureRecognizer.isEnable = false
,等回调控制器已经显示的代理方法后还原设置。
func navigationController(_ navigationController: UINavigationController, didShow viewController: UIViewController, animated: Bool) {
isAnimated = false
interactivePopGestureRecognizer?.isEnabled = true
// pop queue view controllers
dequeueViewController(navigationController)
}