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。所以需要在返回的方法里面加上相应代码,以便其他页面支持侧滑返回, 比如上面点击返回按钮回到根控制器的情况, 就加上这个方法, 其他界面的侧滑就可以恢复正常.

results matching ""

    No results matching ""