2016-03-29 10 views
0

私はtop most ViewControllerを見つけるために次の拡張を使用しています。 アラートが表示された場合、上のコードはUIAlertControllerです。 トップビューコントローラを取得するにはUIAlertControllerUIAlertControllerの下で最もViewController

+0

良い答えがここに見つけることができる:http://stackoverflow.com/q/26554894/3050403 – kelin

答えて

0

次のviewControllerがUIAlertControllerであるかどうかを確認し、そうであればその親を返します。このようなもの:

if let presented = base as? UIAlertController { 
    return base.presentingViewController 
} 

返却前に使用した内線番号にこれを追加します。

はあなたが

extension UIApplication { 
    class func topViewController(base: UIViewController? = (UIApplication.sharedApplication().delegate as! AppDelegate).window?.rootViewController) -> UIViewController? { 
    if let nav = base as? UINavigationController { 
     return topViewController(base: nav.visibleViewController) 
    } 
    if let tab = base as? UITabBarController { 
     if let selected = tab.selectedViewController { 
     return topViewController(base: selected) 
     } 
    } 
    if let alert = base as? UIAlertController { 
     if let presenting = alert.presentingViewController { 
     return topViewController(base: presenting) 
     } 
    } 
    if let presented = base?.presentedViewController { 
     return topViewController(base: presented) 
    } 
    return base 
    } 
} 

はXCodeの上でテストされていない、あなたのコードでこれらの変更を使用してpresentingViewControllerプロパティを使用してUIAlertControllerの親コントローラを得ることができます

extension UIApplication { 
    class func topViewController(base: UIViewController? = (UIApplication.sharedApplication().delegate as! AppDelegate).window?.rootViewController) -> UIViewController? { 
     if let nav = base as? UINavigationController { 
     return topViewController(base: nav.visibleViewController) 
     } 
     if let tab = base as? UITabBarController { 
     if let selected = tab.selectedViewController { 
      return topViewController(base: selected) 
     } 
     } 
     if let presented = base?.presentedViewController { 
     return topViewController(base: presented) 
     } 

     if let alert = base as? UIAlertController { 
     return alert.presentingViewController 
     } 

     return base 
    } 
} 
+0

base.parentViewController :( – Luda

+0

nilを私は私の答えを更新している – Jelly

+0

いや...。 baseがUIAlertControllerでない場合は?.presentedViewController – Luda

1

を更新しました。

+1

それは無限再帰 – Luda

+0

を作る私達はちょうどUIAlertController祖先 – Luda

+0

は申し訳ありませんが、それは' UIAlertController'だっれる人を見つける必要があります。 – atulkhatri

0

私はUIAlertControllerの下で一番上のビューコントローラを取得するためにこの拡張を使用しました。基本的には、UIAlertControllerを見つけたときにトップビューコントローラの検索を停止することです。

extension UIApplication { 

var topViewController: UIViewController? { 
    var viewController = keyWindow?.rootViewController 
    guard viewController != nil else { return nil } 
    var presentedViewController = viewController?.presentedViewController 
    while presentedViewController != nil, !(presentedViewController is UIAlertController) { 
     switch presentedViewController { 
     case let navagationController as UINavigationController: 
      viewController = navagationController.viewControllers.last 
     case let tabBarController as UITabBarController: 
      viewController = tabBarController.selectedViewController 
     default: 
      viewController = viewController?.presentedViewController 
     } 
     presentedViewController = viewController?.presentedViewController 
    } 
    return viewController 
} 

}

関連する問題