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 未按预期工作的主要内容,如果未能解决你的问题,请参考以下文章