Xcode 7, iOS 9 के साथ एक प्रोजेक्ट चलाते समय "एप्लिकेशन विंडो को एप्लिकेशन लॉन्च के अंत में एक रूट व्यू कंट्रोलर होने की उम्मीद है" त्रुटि


89

चल समारोह के बाद

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

एक दुर्घटना है:

 Assertion failure in 
-[UIApplication _runWithMainScene:transitionContext:completion:], /BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKit_Sim/UIKit-

 *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', `enter code here`reason: 'Application windows are expected to have a root view controller at the end of application launch'
*** First throw call stack:
(
    0   CoreFoundation                      0x0000000109377885 __exceptionPreprocess + 165
    1   libobjc.A.dylib                     0x0000000108df0df1 objc_exception_throw + 48
    2   CoreFoundation                      0x00000001093776ea +[NSException raise:format:arguments:] + 106
    3   Foundation                          0x0000000108a42bb1 -[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] + 198
    4   UIKit                               0x000000010760e350 -[UIApplication _runWithMainScene:transitionContext:completion:] + 2875
    5   UIKit                               0x000000010760b73f -[UIApplication workspaceDidEndTransaction:] + 188
    6   FrontBoardServices                  0x000000010b87fd7b FrontBoardServices + 163195
    7   FrontBoardServices                  0x000000010b880118 FrontBoardServices + 164120
    8   CoreFoundation                      0x00000001092a20f1 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 17
    9   CoreFoundation                      0x0000000109297eac __CFRunLoopDoSources0 + 556
    10  CoreFoundation                      0x0000000109297363 __CFRunLoopRun + 867
    11  CoreFoundation                      0x0000000109296d78 CFRunLoopRunSpecific + 488
    12  UIKit                               0x000000010760b091 -[UIApplication _run] + 402
    13  UIKit                               0x000000010760f79b UIApplicationMain + 171
    14  bbwc                                0x00000001037a9998 main + 344
    15  libdyld.dylib                       0x000000010a45ca05 libdyld.dylib + 10757
    16  ???                                 0x0000000000000001 0x0 + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException

यह परियोजना एक पुरानी परियोजना है, मुझे इसे Xcode 7 और iOS 9 के साथ बनाने और चलाने के लिए क्या करना चाहिए?


चूंकि Xcode 7 एक बीटा है, इसलिए आपको किसी भी गंभीर विकास कार्य के लिए Xcode 6 पर वापस जाना चाहिए।
पॉल आर


नमस्ते, मैं यह मिटा रहा हूँ: - *** जोर विफलता - [UIApplication _runWithMainScene: transitionContext: पूर्णता:], /BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKit_Sim/UIKit-3505.16/6/6/6 3294 इसे कैसे हल करें
आकाश रघानी

जवाबों:


175

आपकी त्रुटि संदेश से:

एप्लिकेशन विंडो के एप्लिकेशन लॉन्च के अंत में एक रूट व्यू कंट्रोलर होने की उम्मीद है

यह "पुराना" प्रोजेक्ट कितना पुराना है? यदि यह कुछ वर्षों से अधिक है, तो क्या आपके पास अभी भी है:

[window addSubview:viewController.view];

आपको इसके बजाय इसे प्रतिस्थापित करना चाहिए:

[window setRootViewController:viewController];

1
मुझे एक ही समस्या है और मुझे लगता है कि यह एक iOS 9 मुद्दा है। मेरा प्रोजेक्ट iOS 7 और 8 में काम करता है। किसी कारण से स्टोरीबोर्ड से दृश्य सही तरीके से सेट नहीं किया गया है।
डेविड स्नेबेल-कून

3
आपका बहुत बहुत धन्यवाद । उत्तर त्रुटि संदेश में है: "एप्लिकेशन विंडो" मुझे लगता है कि मेरी परियोजना में दो विंडो हैं, एक सामान्य विडो है, दूसरी एक तीसरी पार्टी है जिसे बुलाया गया है
andrew wang

3
MTStatusBarOverlay और इसके पास एक RootViewController नहीं है, iOS9 के लिए सभी विंडो का एक rootViewController होना आवश्यक है।
andrew wang

1
हां, मुझे वही मुद्दा मिला, आखिरकार। मेरे ऐप में एक अतिरिक्त विंडो है जिसमें रूट व्यू कंट्रोलर नहीं है।
डेविड स्नेबेल-कून

1
मैंने हल ढूंढ लिया है जो मेरे लिए काम करता है: stackoverflow.com/a/32719949/1881895
बारास्ट

37

यदि आपने पहले ही अपने self.window के rootViewController को ऐप डेलिगेट में सेट कर लिया है और अभी भी रनटाइम के दौरान यह त्रुटि हो रही है, तो संभवतः आपके UIApplication में एक से अधिक विंडो हैं, जिनमें से एक में rootViewController संबद्ध नहीं हो सकता है। आप अपनी ऐप विंडो के माध्यम से लूप कर सकते हैं और आपके द्वारा प्राप्त की जा रही त्रुटि को ठीक करने के लिए एक खाली viewController को उसके rootViewController से संबद्ध कर सकते हैं।

यहां एक कोड है जो ऐप विंडो के माध्यम से लूप करता है और एक खाली ViewController को rootViewController से जोड़ता है अगर कोई विंडो इसे याद कर रही है।

NSArray *windows = [[UIApplication sharedApplication] windows];
for(UIWindow *window in windows) {
    NSLog(@"window: %@",window.description);
    if(window.rootViewController == nil){
        UIViewController* vc = [[UIViewController alloc]initWithNibName:nil bundle:nil];
        window.rootViewController = vc;
    }
}

अद्यतन: जाहिरा तौर पर स्थिति पट्टी के लिए समर्पित एक खिड़की है जो आमतौर पर इस मुद्दे का कारण बनती है। उपरोक्त कोड को इस त्रुटि को ठीक करना चाहिए।


2
धन्यवाद!! यह मेरे लिए मुद्दा बन गया। मैंने मुख्य दृश्य नियंत्रक निर्धारित किया था, लेकिन ऐप में एक दूसरी विंडो थी जिससे मैं अनजान था।
n13

इतना ठोस ... मैं कोई बदमाश नहीं हूँ और यह मुझे तब मिला जब Xcode 7.1 को अपडेट करते हुए iOS 9.1 चल रहा है ... स्टेटस बार में एक विंडो समर्पित है ... निश्चित रूप से यह करता है ?! मैं स्टेटस बार छुपा रहा हूँ अगर किसी को कुछ भी मतलब हो।
क्यों ५:४५ बजे

वाह मैं अपने 12 में से 2 ऐप की समीक्षा के लिए दुर्घटनाग्रस्त हो गया था और यह इसे ठीक करने के लिए लगता है।
एंड्रयू स्मिथ

बढ़िया काम किया !! प्यार होगा "स्पष्ट रूप से एक विंडो है जो स्टेटस बार को समर्पित है जो आम तौर पर इस मुद्दे का कारण बनता है।" नहीं देखा कि आ रहा है।
eGanges

1
इस विधि के परिणामस्वरूप परिणाम देखने को मिल सकते हैं और viewWillAppear को आपके rootViewController पर दो बार कॉल किया जा सकता है। यदि आपके पास मैन्युअल रूप से init विंडो है, तो अपनी प्लस्ट की जांच करें और सुनिश्चित करें कि आपके पास विंडो नहीं है। विंडो "xib" को "मेन निब फाइल बेस नाम" के रूप में परिभाषित किया गया है यदि आप इस वर्कअराउंड का उपयोग करने के बाद दो बार चीजों को देख रहे हैं। फिर आपको बस इस कोड को हटाने की जरूरत है और सामान्य रूप से आप की तरहRootViewController।
Whyoz

21

XCODE 7 के लिए आवश्यक है कि सभी विंडोज में एक rootViewController होना चाहिए जिसे आप आसानी से उपयोग कर सकते हैं:

UIViewController* vc = [[UIViewController alloc]initWithNibName:nil bundle:nil];
self.window.rootViewController = vc;

यदि आप केवल UIWindow (किसी भी ट्यूटोरियल से आसान उदाहरणों के लिए - Xcode 7 से पहले) का उपयोग करना चाहते हैं तो यह अच्छा काम कर रहा है!


ढेर अतिप्रवाह में आपका स्वागत है! कृपया अपने कोड को संपादित करने पर विचार करें कि आपका कोड क्या करता है और यह समस्या का समाधान क्यों करेगा, इसके बारे में अधिक विवरण जोड़ने के लिए। एक जवाब जो ज्यादातर सिर्फ कोड होता है (भले ही यह काम कर रहा हो) आमतौर पर ओपी को उनकी समस्या को समझने में मदद नहीं करेगा।
SuperBiasedMan

धन्यवाद, कि मेरे iOS ~ 3–8 चेतावनी => iOS 9 दुर्घटना से बचा, लेकिन एक रिसाव के बारे में एक स्थिर विश्लेषक चेतावनी दी। इसलिए मैंने हेडर में इंटरफ़ेस को डिक्लेरेशन में ले लिया, जिसमें असाइनमेंट में ApplicationDidFinishLaunching था। मैंने तब डील करने के लिए [vc release] को जोड़ा।
फ्लैश शेरिडन

13

ऐसा लगता है कि iOS 9.1 (?) या Xcode 7.1 के बाद से किसी भी UIWindowतात्कालिक रूप से उस पद्धति को छोड़ने से पहले सेट application(_:didFinishLaunchingWithOptions:)करने की आवश्यकता है rootViewController

पहले यह केवल मुख्य विंडो के लिए rootViewControllerउस पद्धति के दौरान एक सेट के लिए पर्याप्त था । अब किसी भी UIWindowउदाहरण के लिए एक वैध rootViewControllerसंपत्ति होना आवश्यक है।

यदि आप UIWindowकिसी अन्य थर्ड पार्टी लाइब्रेरी का उपयोग करते हैं और UIWindowइस दौरान एक नया उदाहरण इनिशियलाइज़ करने की कोशिश करते हैं, तो यहाँ पर अपराधी आपका अपना कोड हो सकता है (जैसे स्टेटस बार मेसेज ओवरले इत्यादि)।

नोट : यदि आप rootViewControlerअपनी मुख्य विंडो पर सेट नहीं करते हैं या आपका स्टोरीबोर्ड सही सेट नहीं है, तो आपको भी वही त्रुटि मिलती है । उन मामलों को साइड नोट के रूप में उल्लेख करना क्योंकि उन मामलों को ठीक करने के लिए बहुत स्पष्ट और सीधा है।


आप शानदार हैं: डी, ​​धन्यवाद आदमी मैं सिर्फ खिड़की के प्रारंभिककरण पर टिप्पणी करता हूं और अब सब ठीक है
मुहम्मद अलबिड

3

इसने मुझे आज भी काट लिया है, और इसे ठीक करने में मुझे कुछ घंटों का समय लगा है: मेरे ऐप में एक "MainWindow.xib" विंडो है, जो नेविगेशन नियंत्रक और साथ में रूट व्यू कंट्रोलर के साथ पूरी तरह से है, जो उचित क्रम में सभी स्वचालित रूप से तुरंत चालू हो गए थे। , Xcode 6 और iOS8 के साथ।

IOS9 पर, AppStore से डाउनलोड किए जाने पर ऐप अभी भी ठीक चलता है, लेकिन तब नहीं जब Xcode 7 के साथ नया बनाया गया हो और iOS 9 पर चलता हो। जिस समय ऐप डेलीगेट अपने ApplicationDidBecomeActive को निष्पादित कर रहा होता है: विधि रूट व्यू कंट्रोलर अब लोड नहीं होता है, क्योंकि यह पहले हुआ करता था! उस रूट व्यू कंट्रोलर ने कॉल को मेरे रीस्टोर स्टेट कोड में मिस कर दिया।

मैंने इसे कोड में, रूट व्यू कंट्रोलर को तुरंत देख कर, और स्पष्ट रूप से अपने स्टेट को देखने से पुनर्स्थापित करके तय किया।


2

आपको अपने ऐप में हर विंडो के रूटव्यूकंट्रोलर प्रॉपर्टी को सेट करना चाहिए


आपके उत्तर ने मेरी मदद की
अज़निक्स

2

मेरे पास एक पुराना प्रोजेक्ट है जो iOS 8 में काम करता है लेकिन iOS 9 में नहीं। यदि आपका मेन इंटरफेस MainWindow.xib पर सेट है, तो इसे स्टोरीबोर्ड पर अपडेट करें। यह मेरे लिए यह तय:

  1. एक नया प्रोजेक्ट बनाएं, सिंगल व्यू एप्लिकेशन ठीक है।
  2. अपने प्रोजेक्ट के लिए Main.storyboard फ़ाइल की प्रतिलिपि बनाएँ, या आप बस अपना बना सकते हैं।
  3. अपनी प्रोजेक्ट सेटिंग्स खोलें और अपने मुख्य इंटरफ़ेस को Main.storyboard पर सेट करें अपने मुख्य इंटरफ़ेस को Main.storyboard पर सेट करें

1

बस अपने rootViewController को नेविगेशनकंट्रोलर पर सेट करें जो नीचे दिए गए मेरे कोड की तरह ऐप-डेलीगेट में आपका UIViewController है। मैं माणिक में नया हूं, लेकिन आशा है कि इससे मदद मिलेगी ...

rootViewController = UIViewController.alloc.init

@window.rootViewController = navigationController

1

मैं इस मुद्दे पर आया एक ऐप के साथ मुझे अधिक अयस्क कम विरासत में मिला। यह पुष्टि करने के बाद कि स्टोरीबोर्ड को एप्लिकेशन मुख्य इंटरफ़ेस के रूप में ठीक से सेट किया गया था और स्टोरीबोर्ड में एक रूटव्यूकंट्रोलर था जो अभी भी दुर्घटनाग्रस्त हो रहा था।

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Application windows are expected to have a root view controller at the end of application launch'

मुझे कुछ और जांच के बाद पता चला कि क्रैश को कुछ व्यू लॉजिक (SVProgressHud) के कारण कहा जा रहा है - (void)applicationDidBecomeActive:(UIApplication *)application । यह Xcode7 में नया व्यवहार प्रतीत होता है लेकिन जहाँ तक मैं बता सकता हूँ कि SVProgressHud स्टोरीबोर्ड द्वारा निर्धारित किए जाने से पहले rootviewcontroller को संदर्भित कर रहा था। अंतत: SVProgressHud को 2.0 में अपडेट करके बग को ठीक किया गया।


0

स्विफ्ट 2 समाधान जो मेरे लिए काम करता है:

AppDelegate -> didFinishLaunchingWithOptions में नीचे कोड डालें

self.window!.rootViewController = storyboard.instantiateViewControllerWithIdentifier("YourRootViewController") as? YourRootViewControllerClass

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.