2017-05-29 120 views
0

我需要找到我的视图控制器层次结构中最顶级的导航控制器。我想不出是肯定的,如果导航控制器和它的顶视图控制器可以同时已经提出了视图控制器,即导航控制器及其顶部视图控制器是否可以同时显示视图控制器?

NavigationController --Presented - > UIViewController的一个

|

|

NavigationController.topViewController --Presented - > UIViewController中乙

同时这可能吗?因为在我将不得不遍历两个路径到最后,比较哪个更长,然后选择正确的路径?

我试过

我尝试了导航控制器和它的顶视图控制器上同时存在的视图控制器,但我得到的LLDB此警告 “试图提出有关谁的观点是不是在窗口层次!”

它没有提供视图控制器(0x100605860),但总是会这样吗?自定义演示文稿可以在窗口层次结构中留下视图吗?

回答

0

presentViewController显示视图控制器。它不返回视图控制器。如果您没有使用UINavigationController,那么您可能正在寻找presentedViewController,您需要从根开始并遍历所呈现的视图。

斯威夫特3. *

extension UIApplication { 
class func topViewController(controller: UIViewController? = UIApplication.shared.keyWindow?.rootViewController) -> UIViewController? { 
    if let navigationController = controller as? UINavigationController { 
     return topViewController(controller: navigationController.visibleViewController) 
    } 
    if let tabController = controller as? UITabBarController { 
     if let selected = tabController.selectedViewController { 
      return topViewController(controller: selected) 
     } 
    } 
    if let presented = controller?.presentedViewController { 
     return topViewController(controller: presented) 
    } 
    return controller 
} 
} 

斯威夫特2

extension UIApplication { 
class func topViewController(controller: UIViewController? = UIApplication.sharedApplication().keyWindow?.rootViewController) -> UIViewController? { 
    if let navigationController = controller as? UINavigationController { 
     return topViewController(navigationController.visibleViewController) 
    } 
    if let tabController = controller as? UITabBarController { 
     if let selected = tabController.selectedViewController { 
      return topViewController(selected) 
     } 
    } 
    if let presented = controller?.presentedViewController { 
     return topViewController(presented) 
    } 
    return controller 
} 
} 

,您就可以使用您的控制器上的任何地方这

if let topController = UIApplication.topViewController() { 
} 
+0

我用这个策略找到topViewController。我需要找到最顶级的UINavigationController,而不是UIViewController或UITabBarController。它是特定于UINavigationController类的。我的问题是,如果在层次结构中的某个UINavigationController上存在视图控制器,此代码是否仍然可以工作? –

+0

在这种情况下,这可能会失败 - 如果let presented = controller?.presentedViewController返回topViewController(controller:呈现) } –

+0

@AamirAnwar检查此https://stackoverflow.com/questions/33395463/in-uinavigationcontroller-what-是不同之处topviewcontroller-visi –

相关问题