2017-11-25 18 views
0

私はSwiftに比較的新しいです peekとpop previewActionItemsを使用しようとすると、編集モードでSpeciesDetailViewControllerを開きます。 SegueにSpeciesDetailViewControllerを表示する際に問題が発生し、エラーメッセージ"Warning: Attempt to present SpeciesDetailViewController whose view is not in the window hierarchy"が発生しました。 found hereにJacob Davisのソリューションを実装しました。NavViewControllerがrootViewControllerの呼び出し後に表示されない

これはウィンドウ階層のエラーを修正しましたが、SpeciesDetailViewControllerコントローラが呼び出されると、ナビゲーションコントローラとtabBarControllerの両方が表示されません。私はこれがトップのViewControllerと呼ばれてSpeciesDetailViewControllerによって引き起こされると考えているが

enter image description here

、私はこの問題を解決する方法についての損失でいます。

ナビゲーションコントローラと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
UITabBarControllerについては

UINavigationControllerあなたが異なる実装が必要になります。

以下は私の現在のコードです。

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 
    } 
} 

今、あなたは関係なく、UINavigationController、UITabBarViewController含むあなたが持っているのUIViewControllerスタックのアプリケーションからtopUIViewControllerを取得するためにこれを使用することができます:ここでは

は私がtopMostViewControllerを取得するために使用しているコードです。

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

Thanks、Grzegorz。しかし、私はこれを実装する方法が少し失われていることを認めなければなりません。 NavigationBarを表示する例を挙げることができますか? –

+0

あなたが持っているUIViewController階層を使って質問を編集できますか?正確に新しいUIViewControllerを表示したいのですか? –

+0

Grzegorz、私はそれをいくつか変更しましたが、私はクラスで約3000行を持っているので、私はあなたが何を見る必要があるか分かりません。 –

関連する問題