2016-12-10 126 views
5

我試圖獲取不在AppDelegate中的當前顯示UIViewController,但它似乎總是得到最初的頂部UIViewController,而不是現在的。如何獲取當前顯示的UIViewController不在AppDelegate中?

中的AppDelegate下面的代碼並得到當前UIViewController存在,但是當我在我的視圖控制器的任何一個使用此相同的功能不工作:

func getTopViewController() -> UIViewController 
{ 
    var topViewController = UIApplication.sharedApplication().delegate!.window!!.rootViewController! 
    while (topViewController.presentedViewController != nil) { 
     topViewController = topViewController.presentedViewController! 
    } 
    return topViewController 
} 

上面的代碼被作爲一個答案提供在類似的問題: Get the current displaying UIViewController on the screen in AppDelegate.m

無論我深入到多深,我只能檢索第一個視圖控制器。

我怎樣才能得到當前顯示UIViewController

供參考:我是不是使用UINavigationController,只是經常UIViewController類。

+0

你正在使用導航控制器嗎? – Lefteris

+0

@Lefteris:更新...謝謝 – Pangu

回答

18

我不喜歡使用這個,但有時它是必要的。

static func getTopViewController() -> UIViewController { 

    var viewController = UIViewController() 

    if let vc = UIApplication.shared.delegate?.window??.rootViewController { 

     viewController = vc 
     var presented = vc 

     while let top = presented.presentedViewController { 
      presented = top 
      viewController = top 
     } 
    } 

    return viewController 
} 

**編輯:

這裏是一個改進版本,它總是會得到最頂部的視圖控制器

static var top: UIViewController? { 
    get { 
     return topViewController() 
    } 
} 

static var root: UIViewController? { 
    get { 
     return UIApplication.shared.delegate?.window??.rootViewController 
    } 
} 

static func topViewController(from viewController: UIViewController? = UIViewController.root) -> UIViewController? { 
    if let tabBarViewController = viewController as? UITabBarController { 
     return topViewController(from: tabBarViewController.selectedViewController) 
    } else if let navigationController = viewController as? UINavigationController { 
     return topViewController(from: navigationController.visibleViewController) 
    } else if let presentedViewController = viewController?.presentedViewController { 
     return topViewController(from: presentedViewController) 
    } else { 
     return viewController 
    } 
} 
+0

這不起作用,我把它放在VC2中,但它仍然抓住最頂級的VC,即VC1,即使我從VC1-> VC2中尋找 – Pangu

+0

您是否嘗試過使用調試和「po 「看你如何獲得VC2? – Markicevic

+0

不確定你的意思是什麼?請詳細說明 – Pangu

1

這裏是一個功能相同的想法:

func topController(_ parent:UIViewController? = nil) -> UIViewController { 
    if let vc = parent { 
     if let tab = vc as? UITabBarController, let selected = tab.selectedViewController { 
      return topController(selected) 
     } else if let nav = vc as? UINavigationController, let top = nav.topViewController { 
      return topController(top) 
     } else if let presented = vc.presentedViewController { 
      return topController(presented) 
     } else { 
      return vc 
     } 
    } else { 
     return topController(UIApplication.shared.keyWindow!.rootViewController!) 
    } 
} 

Swift 4項目中的作品

相關問題