0

我的启动屏幕是根视图,而我的应用向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迫使导航栏出现,但事实并非如此。我的应用看起来仍然是这样的:what it looks like with missing navigation bar

回答

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 

    } 
} 

注:没有测试,但是这应该让你对你的办法。

编辑:另一种方法...

而不是交换的关键窗口的根控制器,创建一个视图控制器,指示要初始化/检索数据。该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) 

    } 
} 
+0

当我使用上面的代码并在模拟器中运行时,他们是一个短暂的时刻,当您可以看到我的旧导航栏,然后出现新的导航栏。我如何解决这个问题?我要删除旧的导航控制器吗? –

+0

不确定...如果我是你,我会替换当前导航控制器中的当前视图控制器,而不是替换'.keyWindow?.rootViewController' – DonMag

+0

导航栏加载后还有一个烦人的滞后,然后用户看到tableview出现。 –

相关问题