48

प्राप्त करना यदि मैं UINavigationController पर दृश्य नियंत्रक और/या वर्तमान मोडल व्यू नियंत्रकों को धक्का देता हूं, तो मैं यह कैसे पता लगा सकता हूं कि सबसे अधिक UIViewController क्या है? या मेरे मामले में, मैं जानना चाहता हूं कि कोई निश्चित UITableViewController सबसे ऊपर है या नहीं।शीर्ष पर सबसे अधिक UIViewController

मैं उपयोग करने की कोशिश:

self.navigationController.topViewController == self 

... लेकिन यह काम नहीं करता। मुझे लगता है कि यह असफल रहा है क्योंकि मैं इसके ऊपर मोडल व्यू कंट्रोलर प्रस्तुत कर रहा हूं और topViewController केवल UINavigationController पर उन विचारों को ट्रैक करता है (जो सामान्य रूप से प्रस्तुत किए गए थे)।

+0

संबंधित: [अगर UIViewController के दृश्य दिखाई दे रहा है बताने के लिए कैसे] (http://stackoverflow.com/questions/2777438/how-to-tell-if-uiviewcontrollers-view-is-visible) – Senseful

उत्तर

86

आप visibleViewController हैं:

वर्तमान में दृश्यमान दृश्य नेविगेशन ढेर के शीर्ष पर या उस रीति से पेश किया गया एक दृश्य नियंत्रक करने के लिए दृश्य नियंत्रक करने के लिए या तो हो सकती है।

+0

सकता है आप कृपया इसे देखें: मैं जानना चाहता हूं कि दृश्य दृश्य दृश्य नियंत्रक का उपयोग उस दृश्य के साथ तुलना करने के लिए करें जिसे मैं ढूंढ रहा हूं। http://stackoverflow.com/questions/7498880/how-to-determine-which-view-loads-on-returning-to-foreground-from-the-background – Namratha

+2

ध्यान दें कि यह केवल 'UINavigationController' के लिए है; यदि आपके पास इनमें से कोई एक नहीं है, तो आपको अन्य माध्यमों का उपयोग करने की आवश्यकता होगी। –

19
NSArray *viewContrlls=[[self navigationController] viewControllers]; 

[viewContrlls lastObject]; 
0

मैं जानता हूँ कि सवाल पुराना है, लेकिन यह अभी भी लोकप्रिय है - यही कारण है कि मैं अपने सबसे अच्छा समाधान है जो विभिन्न UIViewController's उपवर्गों संभालती पोस्ट करना चाहते हैं है। साथ ही आप साइड मेनू जैसे अपने कस्टम "संग्रह" नियंत्रकों द्वारा इस विधि की कार्यक्षमता बढ़ा सकते हैं।

extension UIWindow { 

    var visibleViewController: UIViewController? { 
    guard let rootViewController = rootViewController else { 
     return nil 
    } 
    return visibleViewController(for: rootViewController) 
    } 

    private func visibleViewController(for controller: UIViewController) -> UIViewController { 
    var nextOnStackViewController: UIViewController? = nil 
    if let presented = controller.presentedViewController { 
     nextOnStackViewController = presented 
    } else if let navigationController = controller as? UINavigationController, 
     let visible = navigationController.visibleViewController { 
     nextOnStackViewController = visible 
    } else if let tabBarController = controller as? UITabBarController, 
     let visible = (tabBarController.selectedViewController ?? 
     tabBarController.presentedViewController) { 
     nextOnStackViewController = visible 
    } 

    if let nextOnStackViewController = nextOnStackViewController { 
     return visibleViewController(for: nextOnStackViewController) 
    } else { 
     return controller 
    } 
    } 

} 
संबंधित मुद्दे