navigationController?.navigationBar.isUserInteractionEnabled 未按预期工作

Posted

技术标签:

【中文标题】navigationController?.navigationBar.isUserInteractionEnabled 未按预期工作【英文标题】:navigationController?.navigationBar.isUserInteractionEnabled not working as expected 【发布时间】:2018-04-12 04:36:07 【问题描述】:

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

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

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

【问题讨论】:

“推”是指模态的呈现?我认为您不能在现有导航控制器上“推动”另一个导航控制器,对吗? 或者你有一个单独的导航控制器并且 A 是 root 并且你将 B 推到它上面? 你是不是在A的viewDidAppear里面设置了断点看是否被执行? 尝试在 viewWillAppear 中将其设置为 false 而不是 viewDidAppear 上传代码让我们知道你在做什么 【参考方案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 之类的操作。

【讨论】:

以上是关于navigationController?.navigationBar.isUserInteractionEnabled 未按预期工作的主要内容,如果未能解决你的问题,请参考以下文章

探究navigationBar的translucent属性

iOS 7 导航栏

导航底部黑线去掉

如何在TruncatingMiddle中设置导航标题的linebreakMode

无法禁用情节提要中的后退按钮

设置导航栏分隔符颜色IOS