2016-12-10 13 views
5

Tôi đang cố gắng hiển thị UIViewController hiện không có trong AppDelegate, nhưng dường như luôn có được số đầu tiên là UIViewController và không phải là hiện tại.Làm cách nào để hiển thị UIViewController hiện tại không có trong AppDelegate?

Các mã sau vào appdelegate DOES được UIViewController hiện hiện tại, nhưng chức năng này tương tự không hoạt động khi tôi sử dụng nó trong bất kỳ một trong những Xem Bộ xử lý của tôi:

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

Đoạn mã trên được cung cấp như là một câu trả lời trong một câu hỏi tương tự: Get the current displaying UIViewController on the screen in AppDelegate.m

Cho dù tôi có phân biệt sâu đến mức nào, tôi chỉ có thể truy xuất Trình điều khiển chế độ xem đầu tiên.

Làm cách nào để có được bản trình bày hiện tại UIViewController?

FYI: Tôi là NOT sử dụng UINavigationController, chỉ cần thường xuyên UIViewController lớp học.

+0

Bạn có đang sử dụng bộ điều khiển điều hướng không? – Lefteris

+0

@Lefteris: cập nhật ... cảm ơn – Pangu

Trả lời

18

Tôi không thích sử dụng điều này nhưng đôi khi nó là cần thiết.

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 
} 

** EDIT:

Dưới đây là một phiên bản cải tiến, nó sẽ luôn luôn có được đỉnh nhất điều khiển xem

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

điều này không hoạt động, tôi đặt điều này trong VC2 nhưng nó vẫn nắm bắt được nhiều nhất VC, tức là VC1 mặc dù tôi tách ra từ VC1-> VC2 – Pangu

+0

Bạn đã thử sử dụng gỡ lỗi và "po "để xem làm thế nào bạn có thể nhận được VC2? – Markicevic

+0

không chắc chắn ý bạn là gì? .. hãy xây dựng – Pangu

1

Dưới đây là ý tưởng tương tự trong một chức năng:

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!) 
    } 
} 

hoạt động cho tôi trong dự án Swift 4

Các vấn đề liên quan