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行,我不确定你需要看到什么。 –

相关问题