2017-11-25 79 views
0

我對Swift比較陌生 嘗試使用peek和pop previewActionItems「edit」以編輯模式打開SpeciesDetailViewController。有一個問題試圖讓賽格呈現SpeciesDetailViewController並得到錯誤消息"Warning: Attempt to present SpeciesDetailViewController whose view is not in the window hierarchy"。我在found here上實施了雅各布戴維斯的解決方案。NavigationController在調用rootViewController後不顯示

這固定了窗口層次結構錯誤,但是當調用SpeciesDetailViewController控制器時,導航控制器和tabBarController都不顯示。

enter image description here

雖然我相信這是由SpeciesDetailViewController引起被稱爲是頂級的viewController,我就如何解決這一問題的損失。

你能幫我顯示導航控制器和tabBarController嗎?

下面是我當前的代碼:

主視圖控制器

func showDetailsViewController() { 

    let topVC = topMostController() 
    let storyboard = UIStoryboard(name: "Main", bundle: nil) 
    let vc = storyboard.instantiateViewController(withIdentifier: "SpeciesDetailViewController") as! SpeciesDetailViewController 
    topVC.present(vc, animated: true, completion: nil) 

} 

func topMostController() -> UIViewController { 
    var topController: UIViewController = UIApplication.shared.keyWindow!.rootViewController! 
    while (topController.presentedViewController != nil) { 
     topController = topController.presentedViewController! 
    } 

    return topController 
} 

回答

0

對於UITabBarControllerUINavigationController你需要不同的實現。

下面是我用得到topMostViewController代碼:

protocol TopUIViewController { 
    func topUIViewController() -> UIViewController? 
} 

extension UIWindow : TopUIViewController { 
    func topUIViewController() -> UIViewController? { 
     if let rootViewController = self.rootViewController { 
      return self.recursiveTopUIViewController(from: rootViewController) 
     } 

     return nil 
    } 

    private func recursiveTopUIViewController(from: UIViewController?) -> UIViewController? { 
     if let topVC = from?.topUIViewController() { return recursiveTopUIViewController(from: topVC) ?? from } 
     return from 
    } 
} 

extension UIViewController : TopUIViewController { 
    @objc open func topUIViewController() -> UIViewController? { 
     return self.presentedViewController 
    } 
} 

extension UINavigationController { 
    override open func topUIViewController() -> UIViewController? { 
     return self.visibleViewController 
    } 
} 

extension UITabBarController { 
    override open func topUIViewController() -> UIViewController? { 
     return self.selectedViewController ?? presentedViewController 
    } 
} 

現在你可以用它來從應用程序中獲取topUIViewController無論UIViewController中的堆棧你有,包括UINavigationController的,UITabBarViewController。

let topVC = UIApplication.shared.keyWindow!.rootViewController!.topUIViewController() 
+0

謝謝Grzegorz。但是,我必須承認我對如何實現這一點有點失落。你能舉一個關於顯示NavigationBar的例子嗎? –

+0

我不完全確定,也許我誤解了你的問題 - 你可以用UIViewController層次結構編輯你的問題,你想在哪裏顯示新的UIViewController? –

+0

Grzegorz,我改變了一些,但由於我在班級中有大約3000行,我不確定你需要看到什麼。 –

相關問題