【问题标题】:Navigation Bar removed导航栏已移除
【发布时间】:2018-08-27 17:15:17
【问题描述】:

我在我的应用中使用了导航项。在注销方法中,我已经弹出到根视图控制器,即我的 loginViewController,但这样做时导航栏会被删除。我尝试将代码加载到 viewWillAppear 中,但它仍然无法正常工作。你能帮帮我吗?

这是我的注销代码:

@IBAction func btnLogOutClicked(_ sender: Any) {
        let log : LoginViewController = self.storyboard?.instantiateViewController(withIdentifier: "LoginViewController") as! LoginViewController
        let window:UIWindow = UIApplication.shared.keyWindow!
        let navControl : UINavigationController = window.rootViewController as! UINavigationController
        if (!(navControl .isEqual(log)))
        {
            window.rootViewController = log
        }
        navControl.popToRootViewController(animated: true)
    }

My viewWillAppear-

override func viewWillAppear(_ animated: Bool) {
        self.navigationController?.isNavigationBarHidden = false
        self.navigationItem.hidesBackButton = true
        self.navigationItem.title = "Select Client"
        // create a new butto
        let button: UIButton = UIButton(type: UIButtonType.custom)
        //set image for button
        button.setImage(UIImage(named: "logo-icon"), for: UIControlState.normal)
        //set frame
        button.frame = CGRect(x: 0, y: 0, width: 50, height: 30)
        let barButton = UIBarButtonItem(customView: button)
        //assign button to navigationbar
        self.navigationItem.leftBarButtonItem = barButton


    }

这是我的故事板-

我正在使用 pushViewController 从登录视图控制器访问标签栏控制器

【问题讨论】:

  • super.viewWillAppear(animated) 添加为viewWillAppear(_ animated: Bool) 方法的第一行代码
  • 并且也使用self.navigationController?.setNavigationBarHidden(false, animated: false)而不是self.navigationController?.isNavigationBarHidden = false
  • 感谢您的帮助。我试图添加它,但它还没有工作。当我放置一个调试点并执行“po self.navigationController”时,它会打印“nil”。
  • @Amit navControl.rootViewController = log 语法错误。因为它是一个只能获取的属性。

标签: ios swift uinavigationcontroller uinavigationbar


【解决方案1】:

尝试下面的代码来更改NavigationController 堆栈:

let oldVCs = self.navigationController?.viewControllers
let newVCs = [UIViewController]()

 // Add your root VC in new array of VCs
 newVCs.append(oldVCs![0])
 // Add your new VC just after your root VC
 let log : LoginViewController = self.storyboard?.instantiateViewController(withIdentifier: "LoginViewController") as! LoginViewController

 newVCs.append(log)

 self.navigationController?.setViewControllers(newVCs , animated: true)

在这种情况下,动画就像在堆栈中推送一个新控制器。

如果您想完全离开该堆栈并创建一个新堆栈:

let log : LoginViewController = self.storyboard?.instantiateViewController(withIdentifier: "LoginViewController") as! LoginViewController

let loginNavigationController = UINavigationController(rootViewController: log)            
self.view.window?.rootViewController = loginNavigationController

【讨论】:

  • 这行得通,谢谢。但它在前一个屏幕的登录屏幕底部添加了标签栏。我正在使用标签栏控制器来显示不同的标签,从标签上注销时,标签栏仍然在登录屏幕上可见。
  • 在这种情况下,我猜你的根视图是标签栏控制器
  • 我已经在帖子中附上了故事板
  • 非常感谢。它根据需要工作。一个问题,为什么根视图是标签栏控制器而不是登录视图控制器?
  • 你的窗口根视图控制器是标签栏,并且你已经添加了导航控制器堆栈。
猜你喜欢
  • 2017-06-29
  • 2017-06-10
  • 1970-01-01
  • 2013-10-05
  • 1970-01-01
  • 2022-08-05
  • 2013-10-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多