Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 隐藏/显示视图中的导航栏将出现和视图将消失UI故障_Ios_Swift_Uikit - Fatal编程技术网

Ios 隐藏/显示视图中的导航栏将出现和视图将消失UI故障

Ios 隐藏/显示视图中的导航栏将出现和视图将消失UI故障,ios,swift,uikit,Ios,Swift,Uikit,所以我有两个VC,我想设置它的导航栏,当它出现时隐藏,当它消失时再次显示。这是我的密码 class FirstNavigationVCViewController: UIViewController { @IBOutlet weak var button: UIButton! override func viewDidLoad() { super.viewDidLoad() title = "First Nav"

所以我有两个VC,我想设置它的导航栏,当它出现时隐藏,当它消失时再次显示。这是我的密码

class FirstNavigationVCViewController: UIViewController {

    @IBOutlet weak var button: UIButton!
    override func viewDidLoad() {
        super.viewDidLoad()

        title = "First Nav"
        button.addTarget(self, action: #selector(press), for: .touchUpInside)
    }
    
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        navigationController?.setNavigationBarHidden(true, animated: true)
    }
    
    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        navigationController?.setNavigationBarHidden(false, animated: true)
    }
    
    
    @objc func press() {
        navigationController?.pushViewController(SecondNavigationViewController(), animated: true)
    }

}

class SecondNavigationViewController: UIViewController {

    @IBOutlet weak var button: UIButton!
    
    override func viewDidLoad() {
        super.viewDidLoad()

        title = "Second Nav"
        button.addTarget(self, action: #selector(press), for: .touchUpInside)
    }
    
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        navigationController?.setNavigationBarHidden(true, animated: true)
    }
    
    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        navigationController?.setNavigationBarHidden(false, animated: true)
    }
    
    @objc func press() {
        navigationController?.popViewController(animated: true)
    }
}
我假设使用该代码,当第二个vc弹出时,导航栏不会显示,但是我得到了这个


你们有更好的解决方案吗,这样我仍然可以在没有动画的情况下隐藏两个vc的导航栏?

如果您希望隐藏导航栏,那么为什么在视图中两个视图控制器都会消失(:),您调用
navigationController?.setNavigationBarHidden(false,动画:true)

当第一个视图控制器开始消失时,导航栏会返回,而当第二个视图控制器开始出现时,导航栏会再次消失。这也反过来发生

如果希望它位于第一个视图控制器中,而不位于第二个视图控制器中,则在第一个视图控制器的视图上,将调用


navigationController?.setNavigationBarHidden(真,动画:真)

在制作新动画之前,只需从navigationBar层删除所有动画即可

class TestVC: UIViewController {
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        navigationController?.setNavigationBarHiddenSafe(true, animated: animated)
    }
    
    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        navigationController?.setNavigationBarHiddenSafe(false, animated: animated)
    }
}

extension UINavigationController {
    func setNavigationBarHiddenSafe(_ hidden: Bool, animated: Bool) {
        navigationBar.layer.removeAllAnimations()
        setNavigationBarHidden(hidden, animated: animated)
    }
}

这是一种肮脏的方式——苹果可能会在未来改变这种行为,它将停止工作(虽然不太可能,但仍然如此)。很好,您需要使用一些路由器来解析导航控制器状态并管理导航变量可见性。

在导航过程中,将动画值设置为false而不是true

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    navigationController?.setNavigationBarHidden(true, animated: false)
}

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    navigationController?.setNavigationBarHidden(false, animated: false)
}