2017-05-29 152 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 –

相關問題