实例化一个保持导航栏Swift的vc

Posted

技术标签:

【中文标题】实例化一个保持导航栏Swift的vc【英文标题】:Instantiate a vc keeping the navigation bar Swift 【发布时间】:2020-01-05 10:31:27 【问题描述】:

我想在响应远程通知操作时显示NewMapViewController,但如果我直接实例化NewMapViewController,我会松开导航栏。如果我改为实例化 navigationController 并执行 segue,我会看到所有视图控制器(启动和登录)一个接一个地出现,这非常令人不快。有没有办法将导航栏保持在NewMapViewController 并避免级联显示所有视图控制器?一如既往,非常感谢您的帮助。

这是我尝试过的:

case Id.checkActionIdentifier:
            print("Check tapped")
            let userInfo = response.notification.request.content.userInfo
            if let routeToCheck = userInfo[NSLocalizedString("Route", comment: "")] as? String 
                RoutesArray.routeName = routeToCheck
//                print("rotta is: \(routeToCheck)")
            
//            let content = response.notification.request.content
//            print(" Body \(content.body)")
//            print(" Title \(content.title)")
            NewMapViewController.routeCheckCounter = 1

            //  Goes to NewMapViewController but showing the splash and login VC first
            let storyboard = UIStoryboard(name: "Main", bundle: nil)
            let initialViewController : UINavigationController = storyboard.instantiateViewController(withIdentifier: "MainNavigationController") as! UINavigationController
            self.window?.rootViewController = initialViewController
            self.window?.makeKeyAndVisible()
            let vc = initialViewController.viewControllers[0]
            vc.performSegue(withIdentifier: "alertToMapSegue", sender: nil)

            // goes straight to NewMapViewController but looses nav bar
//            let storyboard = UIStoryboard(name: "Main", bundle: nil)
//            let initialViewController : UIViewController = storyboard.instantiateViewController(withIdentifier: "NewMapViewController") as! NewMapViewController
//            self.window?.rootViewController = initialViewController
//            self.window?.makeKeyAndVisible()

更新:

我已经能够避免通过登录vc,但仍然显示NewMapViewController之前的启动画面,代码:

let storyboard = UIStoryboard(name: "Main", bundle: nil)
            let vc = storyboard.instantiateViewController(withIdentifier: "NewMapViewController") as UIViewController
            self.window?.rootViewController?.show(vc, sender: self)

【问题讨论】:

【参考方案1】:

看起来windows rootViewController 已经是UINavitationController,所以你可以像下面这样简单地抓住它并按下NewMapViewController

 case Id.checkActionIdentifier:
     let userInfo = response.notification.request.content.userInfo
     if let routeToCheck = userInfo[NSLocalizedString("Route", comment: "")] as? String 
         RoutesArray.routeName = routeToCheck
     
     NewMapViewController.routeCheckCounter = 1

     if let navigationVC = self.window?.rootViewController as? UINavigationController 
         let main = UIStoryboard(name: "Main", bundle: nil)
         let newMapVC = main.instantiateViewController(withIdentifier: "NewMapViewController") as! NewMapViewController
         navigationVC.pushViewController(newMapVC, animated: true)
     

【讨论】:

谢谢。我仍然会在我的更新代码中显示启动画面,但我只是希望应用程序在NewMapViewController 上启动,点击操作按钮。有没有办法避免显示? 我认为您无能为力,因为操作系统会在恢复应用程序时显示启动画面(或操作系统捕获的最新屏幕截图)。 我明白了,所以我只能坚持下去。非常感谢您的帮助。 @Karman 我刚刚发现这种到达NewMapViewController 的方式会导致函数出现奇怪的行为。如果NewMapViewController.routeCheckCounter' is greater than 0. It loads a route, displays it as a MKPolyline` 会调用此函数并调整视图大小以放大它。由于问题的变化,它不再设置区域。你知道为什么吗?我的意思是该功能的其余部分正确地完成了它的工作。

以上是关于实例化一个保持导航栏Swift的vc的主要内容,如果未能解决你的问题,请参考以下文章

Swift:尽管我调用了所需的代码,但导航栏却隐藏了?

动态创建视图控制器后导航栏消失

从标签栏控制器跳回导航控制器 - swift 4

使用标签栏和导航实例化深度视图控制器

Swift - 如何在 2 个视图控制器之间导航时删除黑色导航栏

导航栏在 iPhone XS Max swift 上关闭视图控制器上的视图