2011-05-11 19 views
30

मेरे पास एक दृश्य है जो UIViewController (रूट) है जो विज्ञापनों को नियंत्रित करता है और UINavigationController। उस UINavigationController में मैं नियंत्रकों की ठेठ परतें है। मेरी कस्टम सेटिंग्स तालिका में नियंत्रक देखें, मेरे पास समर्थन के लिए मुझसे संपर्क करने के लिए एक बटन है। जब उपयोगकर्ता इस बटन पर क्लिक करता है तो मैं MFMailComposeViewController बनाता हूं और इसे प्रस्तुत करना चाहता हूं। मैं सेटिंग तालिका दृश्य से इसे प्रस्तुत नहीं कर सकता क्योंकि यह मेरे विज्ञापनों के नीचे होगा, इसलिए मुझे रूट व्यू को संदर्भित करने और इसे वहां से प्रस्तुत करने की आवश्यकता है। मैंने self.parentViewController.parentViewController की कोशिश की है जहां स्वयं सेटिंग्स तालिका दृश्य है, लेकिन यह काम नहीं करता है। मुझे इसका संदर्भ कैसे देना चाहिए। यह रूट व्यू को सीधे संदर्भित करने और सेटिंग दृश्य में पास करने के लिए एक खराब डिज़ाइन की तरह लगता है।रूट UIViewController को कैसे ढूंढें

+0

आप self.navigationController की कोशिश की? मैं स्पष्ट नहीं हूं कि आपका दृश्य पदानुक्रम कैसे स्थापित किया गया है। – jaminguy

उत्तर

78

वर्तमान keyWindow प्राप्त करें:

UIWindow *window = [UIApplication sharedApplication].keyWindow; 

अपने rootViewController प्राप्त करें:

UIViewController *rootViewController = window.rootViewController; 

नोट: यदि वर्तमान में UIAlertView दिखाया जा रहा है, तो एक नई हवा ओउ बनाया जा रहा है और keyWindow होने के लिए असाइन किया गया है। अन्य असाधारण मामले भी हो सकते हैं जो आपकी एप्लिकेशन विंडो को कुंजीविंडो नहीं रखेंगे।

+1

यह केवल 4.0+ पर काम करता है। UIWindow में 4.0 से पहले रूटव्यू कंट्रोलर प्रॉपर्टी नहीं थी। –

+1

@ जेसे अच्छा बिंदु - मुझे बहुत खुशी है कि मुझे उन प्राचीन ईंटों का समर्थन करने की ज़रूरत नहीं है;)। – Till

+0

हाँ, यह बेकार है। मैं अपने समय का कम से कम 50% कहूंगा। –

2

ऐप सिंगलटन का उपयोग करें। कुछ की तरह:

[[[UIApplication sharedApplication] delegate] rootViewController] अगर यह मिलना चाहिए अपने ViewController जड़ का नाम है यह है कि rootViewController

-4

यूआईएप्लिकेशन ऑब्जेक्ट प्राप्त करें। कुंजीविंडो खोजने के लिए विंडोज सरणी के माध्यम से चक्र। और फिर rootViewController प्रॉपर्टी प्राप्त करें।

[[[[UIApplication sharedApplication] delegate] window] rootViewController]

नोट::

31

मेरे अनुभव में, यह प्राप्त करने के लिए rootViewController आदर्श समाधान है में दर-मामला एक सक्रिय UIAlert या UIActionSheet की, तो आप अपने कुंजी विंडो के रूप में चेतावनी या कार्रवाई शीट मिल ।

+0

+1 यह करने का यह एकमात्र सुरक्षित, विश्वसनीय तरीका है। एक चेतावनी + कुंजीविंडो बग को ट्रैक करने के लिए मेरे लिए उम्र ले ली, और इस पोस्ट ने मुझे बचाया! – stonemonk

+2

दूसरा वह! कुंजीविंडो दृष्टिकोण (वर्तमान में सही उत्तर के रूप में चिह्नित) विश्वसनीय नहीं है, क्योंकि कुंजी विंडो बदल सकती है। –

+0

को UIAlertView के दौरान कीविंडो का उपयोग करने के साथ भी एक बग था ... इसके लिए धन्यवाद! यह उपयोग करने का सबसे अच्छा तरीका है। – manroe

1

तुम हमेशा इस कोड के 1 लाइन के साथ हल कर सकते हैं, लेकिन मैं यह करने के लिए इस स्विफ्ट तरह से अनुशंसा करते हैं, तो आप कहीं से भी इस कॉल कर सकते हैं, इसकी भी दुर्घटना और बग सुरक्षित:

/// EZSwiftExtensions - Gives you the VC on top so you can easily push your popups 
var topMostVC: UIViewController? { 
    var presentedVC = UIApplication.sharedApplication().keyWindow?.rootViewController 
    while let pVC = presentedVC?.presentedViewController { 
     presentedVC = pVC 
    } 

    if presentedVC == nil { 
     print("EZSwiftExtensions Error: You don't have any views set. You may be calling them in viewDidLoad. Try viewDidAppear instead.") 
    } 
    return presentedVC 
} 

यह एक मानक के रूप में शामिल समारोह में:

https://github.com/goktugyil/EZSwiftExtensions

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