iOS 中禁止单个界面侧滑, 其他页面正常使用
业务需求中, 往往需要某个特定界面返回的时候不遵循导航栈顺序, 跳转到指定界面或者根控制器.
首先, 在点击导航栏返回按钮时候需要判断, 是否返回根控制器, 或者跳转到某个指定界面(虽然这是个反人类的操作, 但也没办法) 通过重写 navigationShouldPopOnBackButton 方法, 决定是否执行每个返回操作. 比如判断导航栈的上一个控制器, 决定是否返回
// 返回按钮点击情况
override func navigationShouldPopOnBackButton() -> Bool {
if let vcArray = navigationController?.viewControllers {
if let currentIndex = vcArray.index(of: self) {
if let _ = vcArray[currentIndex - 1] as? UserCertificateWithInfoViewController {
navigationController?.interactivePopGestureRecognizer?.isEnabled = true
_ = navigationController?.popToRootViewController(animated: true)
} else {
return true
}
}
}
return false
}
然后就是在 viewDidAppear 时候禁止侧滑返回, 在 viewWillDisappear 时候取消静止
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
// 禁止侧滑返回
navigationController?.interactivePopGestureRecognizer?.isEnabled = false
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillAppear(animated)
// 在其他离开改页面的方法同样加上下面代码
navigationController?.interactivePopGestureRecognizer?.isEnabled = true
}
如果调用了popToRootViewControllerAnimated,不会走 viewDidDisappear。所以需要在返回的方法里面加上相应代码,以便其他页面支持侧滑返回, 比如上面点击返回按钮回到根控制器的情况, 就加上这个方法, 其他界面的侧滑就可以恢复正常.