2011-12-21 11 views
10

शेयरकिट में, कोड को यह निर्धारित करने की आवश्यकता है कि rootViewController कहां है, इसलिए यह एक मोडल व्यू दिखा सकता है। किसी कारण से, कोड आईओएस 5:आईओएस में रूट व्यू कंट्रोलर ढूंढना

// Try to find the root view controller programmically 

    // Find the top window (that is not an alert view or other window) 
    UIWindow *topWindow = [[UIApplication sharedApplication] keyWindow]; 
    if (topWindow.windowLevel != UIWindowLevelNormal) 
    { 
     NSArray *windows = [[UIApplication sharedApplication] windows]; 
     for(topWindow in windows) 
     { 
      if (topWindow.windowLevel == UIWindowLevelNormal) 
       break; 
     } 
    } 

    UIView *rootView = [[topWindow subviews] objectAtIndex:0]; 
    id nextResponder = [rootView nextResponder]; 

    if ([nextResponder isKindOfClass:[UIViewController class]]) 
     self.rootViewController = nextResponder; 

    else 
     NSAssert(NO, @"ShareKit: Could not find a root view controller. You can assign one manually by calling [[SHK currentHelper] setRootViewController:YOURROOTVIEWCONTROLLER]."); 

यह असफल रहा है।

इसके बजाय निम्न कोड का उपयोग करने में क्या गलत है?

rootViewController = [[[UIApplication sharedApplication] keyWindow] rootViewController]; 

ऐसा लगता है कि यह ठीक काम कर रहा है। क्या यह कुछ स्थितियों में विफल हो जाएगा?

उत्तर

27

मुझे यकीन नहीं है कि आप window.rootViewController बी/सी पर भरोसा कर सकते हैं, आपको इसे सेट करने की आवश्यकता नहीं है। आप बस विंडो में एक सबव्यूव जोड़ सकते हैं।

id rootVC = [[[[[UIApplication sharedApplication] keyWindow] subviews] objectAtIndex:0] nextResponder]; 
+0

:

/// EZSwiftExtensions - Gives you the VC on top so you can easily push your popups public 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 } 

इसकी में एक मानक समारोह के रूप में शामिल निम्नलिखित ठीक काम करने के लिए लग रहा था धन्यवाद। RootViewController इस मामले में सेट है। यह मुझे स्पष्ट नहीं है कि बस यह सेटिंग स्वचालित रूप से रूटव्यू कंट्रोलर को इस शेयरकिट कोड के उद्देश्य के लिए बनाता है। यह एक सार्वभौमिक ऐप है, और आईफोन कोड में, rootViewController एक उप-वर्गीकृत UITabBarController है। मुझे यह जोड़ना चाहिए कि मेरे पास एक यूआईएलर्टव्यू और यूआईवीव भी एप्लिकेशन विंडो में सबव्यूव के रूप में जोड़ा गया है। (मैं टैबबंट कंट्रोलर से कौन सा दृश्य दिखा रहा हूं, इस पर ध्यान दिए बिना मैं इनमें से एक या दोनों को दिखा सकता हूं।) आपका कोड UIAlertView को ऑब्जेक्ट एट इंडेक्स: 0 के रूप में देता है। मैं बस बाकी के माध्यम से पुन: प्रयास कर सकता हूं, मुझे लगता है। – Jim

+1

यदि आप इसे अपने ऐप में सेट कर रहे हैं तो यह निश्चित रूप से काम करेगा। मुझे नहीं पता था कि क्या आप दूसरों के लिए लाइब्रेरी बना रहे हैं, जहां आप 'window.rootViewController' पर भरोसा नहीं कर सकते हैं। – XJones

+0

@XJones, क्या होगा अगर window.rootViewController सेट नहीं है? क्या वर्तमान दृश्य नियंत्रक को विश्वसनीय रूप से प्राप्त करने का कोई अन्य तरीका है? – Zennichimaro

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