1

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

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

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

4

1 回答 1

2

这似乎是一个错误,您可以通过在主线程上执行此操作来解决:

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

但这仍然会留下一个毫秒窗口,在该窗口中navigationBar启用 ' 的交互。
你必须非常快。


然而...

我不会推荐你在做什么;即禁用navigationBar.
你可能会失去这个back能力,如果它有一个,因为你只是navigationBar完全禁用了。

建议:

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

IE

@IBOutlet var myBarButtonItem: UIBarButtonItem!

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

此外, this 的状态barButtonItem是在 thisviewController本身中处理的,您不需要像self.navigationController?.navigationBar.isUserInteractionEnabled = true其他地方那样做事情。

于 2018-04-12T06:22:09.507 回答