navigationController?.navigationBar.isUserInteractionEnabled无法按预期工作

时间:2018-04-12 04:36:07

标签: swift uinavigationcontroller uinavigationbar viewdidappear isuserinteractionenabled

对于以下viewController层次结构,isUserInteractionEnabled似乎没有按预期工作。

NavigationController(ViewController A)---推送到---> NavigationController(ViewController B)

在ViewController A的viewDidAppear方法中,我将navigationController?.navigationBar.isUserInteractionEnabled设置为false,并在ViewController B的viewDidAppear方法中将其设置为true。但是,在弹出ViewController B并返回ViewController A时,导航栏仍然可以进行用户交互。任何有关为什么会发生这种情况的想法都非常感谢,提前感谢!

1 个答案:

答案 0 :(得分:1)

这似乎是一个错误,你可以在主线程上做到这一点:

override func viewDidAppear(_ animated: Bool) {
    //...        
    DispatchQueue.main.async {
        self.navigationController?.navigationBar.isUserInteractionEnabled = false
    }
}

但是这仍然留下了一个毫秒级的窗口,其中启用了navigationBar的交互 你必须非常快。

然而...

我不会推荐你正在做的事情;即禁用navigationBar 您可能会失去back能力,如果它有一个,因为您只是完全禁用navigationBar

建议:

由于导航堆栈中的每个viewController都拥有它自己的navigationItem,其中包含它自己的barButtonItems,我建议您保留参考UIBarButtonItem并明确启用/禁用它们。

@IBOutlet var myBarButtonItem: UIBarButtonItem!

override func viewDidAppear(_ animated: Bool) {
    //...
    myBarButtonItem.isEnabled = false
}

此外,此barButtonItem的状态在此viewController中处理,您无需在其他地方执行self.navigationController?.navigationBar.isUserInteractionEnabled = true等操作。