【问题标题】:Navigation Bar Disappears Change Root ViewController and then reassign导航栏消失更改根视图控制器,然后重新分配
【发布时间】:2017-10-18 16:21:33
【问题描述】:

当我的应用向 firebase 发出请求时,我已将启动屏幕设为根视图,然后在请求完成后重新分配根视图。不幸的是,当我这样做时,我的导航栏消失或被新的根视图覆盖。当我运行模拟器时,我可以简单地看到导航栏,然后它被我的 TableViewController 覆盖。如何防止这种情况发生?

这是我在 AppDelegate 中实现所有这些的代码:

    var window: UIWindow?
let searchManager = SearchManager()

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    makeRootViewLaunchScreen()
    FirebaseApp.configure()
    searchManager.getMosaicTitles { results in
        self.searchManager.listOfMosaics = results
        self.stopDisplayingLaunchScreen()
    }
    // Adds border to bottom of the nav bar
    UINavigationBar.appearance().shadowImage = UIImage.imageWithColor(color: UIColor(red:0.00, green:0.87, blue:0.39, alpha:1.0))
    // Override point for customization after application launch.
    return true
}

func makeRootViewLaunchScreen() {
    let mainStoryboard: UIStoryboard = UIStoryboard(name: "LaunchScreen", bundle: nil)
    let viewController = mainStoryboard.instantiateViewController(withIdentifier: "launchScreen")
    UIApplication.shared.keyWindow?.rootViewController = viewController
}

func stopDisplayingLaunchScreen() {
    let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
    let viewController = mainStoryboard.instantiateViewController(withIdentifier: "centralViewController") as? SearchResultsTableViewController
    viewController?.searchManager = searchManager
    UIApplication.shared.keyWindow?.rootViewController = viewController
    UIApplication.shared.keyWindow?.rootViewController?.navigationController?.isNavigationBarHidden = false
}

如您所见,我尝试使用UIApplication.shared.keyWindow?.rootViewController?.navigationController?.isNavigationBarHidden = false 来强制显示导航栏,但它没有。我的应用仍然是这样的:

【问题讨论】:

    标签: ios uitableview uinavigationcontroller uinavigationbar rootview


    【解决方案1】:

    您将UIViewController 设置为您的根控制器。您要做的是将UINavigationController 设置为您的根控制器。

    要么在你的故事板中创建一个新的导航控制器并加载那个而不是加载“centralViewController”,要么像这样修改你的函数:

    func stopDisplayingLaunchScreen() {
        let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
    
        if let viewController = mainStoryboard.instantiateViewController(withIdentifier: "centralViewController") as? SearchResultsTableViewController {
    
            viewController.searchManager = searchManager
    
            // create a new UINavigationController
            let newNavVC = UINavigationController()
    
            // set the "root" VC of the NavVC to your SearchResultsTableViewController
            newNavVC.setViewControllers([viewController], animated: false)
    
            // use the new NavVC as the new rootViewController
            UIApplication.shared.keyWindow?.rootViewController = newNavVC
            UIApplication.shared.keyWindow?.rootViewController?.navigationController?.isNavigationBarHidden = false
    
        }
    }
    

    注意:未经测试,但这应该可以帮助您上路。

    编辑:另一种方法...

    不要交换键窗口的根控制器,而是创建一个 ViewController 来指示您正在初始化/检索数据。该 VC 可以是导航控制器的“根”。

    将您的searchManager.getMosaicTitles 函数放在那个 VC 中。完成后,用 TableVC 替换导航控制器中当前的“启动”控制器。它看起来像这样:

    // note: searchManager will have to be a reference back to AppDelegate.searchManager
    searchManager.getMosaicTitles { results in
        self.searchManager.listOfMosaics = results
    
        let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
    
        if let viewController = mainStoryboard.instantiateViewController(withIdentifier: "centralViewController") as? SearchResultsTableViewController {
    
            viewController.searchManager = searchManager
    
            // replace the current Nav VC stack with the new SearchResultsTableViewController
            self.navigationController.setViewControllers([viewController], animated: false)
    
        }
    }
    

    【讨论】:

    • 当我使用上面的代码并在模拟器中运行它时,你可以看到我的旧导航栏,然后出现新的导航栏。我该如何解决?我要删除旧的导航控制器吗?
    • 不确定...如果我是你,我会在当前导航控制器中替换当前视图控制器,而不是替换 .keyWindow?.rootViewController
    • 还有一个恼人的延迟,导航栏加载然后用户看到 tableview 出现。
    • 我不太明白你所说的“在当前的导航控制器中替换当前的视图控制器,而不是替换.keyWindow?.rootViewController”是什么意思,你介意澄清一下吗?
    【解决方案2】:

    为了防止出现导航栏控制器和 tableView 出现之间的延迟,请查看以下内容。 Prevent navigation bar from disappearing without lag

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多