2015-06-17 6 views
75

läuft Nach Funktion läuft„Anwendungsfenster wird erwartet, dass eine Wurzel-View-Controller am Ende des Anwendungsstart haben“ Fehler, wenn Sie ein Projekt mit Xcode 7, iOS 9

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

ein Absturz ist:

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 

Dieses Projekt ist ein altes Projekt, was soll ich tun, um es mit Xcode 7 und iOS 9 zu erstellen und zu betreiben?

+0

Seit Xcode 7 ist ein Beta Sie wahrscheinlich zurück Xcode gehen sollte 6 für jede ernsthafte Entwicklungsarbeit. –

+1

mögliches Duplikat von [Es wird erwartet, dass Anwendungen am Ende des Anwendungsstarts einen Root View Controller haben (http: // stackoverflow.com/questions/7520971/Anwendungen-sind-zu-haben-ein-root-View-Controller-am-Ende der Anwendung erwartet) – Droppy

+0

Hallo, ich bekomme diesen Eror: - *** Assertion Fehler in - [UIApplication _runWithMainScene: transitionContext: completion:], /BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKit_Sim/UIKit-3505.16/UIApplication.m:3294 Wie löst man das –

Antwort

151

aus Ihrer Fehlermeldung:

Anwendungsfenster erwartet

am Ende des Anwendungsstarts

Wie alt einen Root-View-Controller haben, ist dieses „alte“ Projekt? Wenn es mehr als ein paar Jahren haben Sie noch:

[window addSubview:viewController.view]; 

Sie sollten es stattdessen ersetzen mit:

[window setRootViewController:viewController]; 
+1

Ich habe das gleiche Problem und denke ich Es ist ein iOS 9 Problem. Mein Projekt funktioniert in iOS 7 & 8. Aus irgendeinem Grund ist die Ansicht vom Storyboard nicht richtig eingestellt. –

+3

Vielen Dank. Die Antwort ist in der Fehlermeldung: "Application windows" Ich finde, es gibt zwei Fenster in meinem Projekt, eine ist normal widdow, die andere ist eine dritte Partei modual –

+2

MTStatusBarOverlay und es hat keine RootViewController, iOS9 erfordern alle Fenster muss einen rootViewController haben. –

2

Sie jedes Fenster des RootViewController Eigenschaft in Ihrer Anwendung festlegen sollte

+0

Ihre Antwort hat mir geholfen – Aznix

21

XCODE 7 erfordert, dass alle Windows einen rootViewController haben müssen Sie können einfach verwenden:

Es funktioniert gut, wenn Sie nur UIWindow verwenden müssen (für einfache Beispiele aus allen Tutorials - vor Xcode 7)!

+0

Willkommen bei Stack Overflow! Bitte bedenken Sie, dass Sie Ihren Beitrag bearbeiten müssen, um weitere Erklärungen dazu zu erhalten, was Ihr Code tut und warum es das Problem löst. Eine Antwort, die meist nur Code enthält (auch wenn es funktioniert), hilft dem OP normalerweise nicht, sein Problem zu verstehen. – SuperBiasedMan

+0

Danke, das vermied meine iOS ~ 3-8 Warnung => iOS 9 Absturz, aber gab einen statischen Analyzer warnt vor einem Leck. Also habe ich die Deklaration mit der Zuweisung in applicationDidFinishLaunch auf die Schnittstelle in der Kopfzeile verschoben. Ich habe dann [vc release] zu dealloc hinzugefügt. –

30

Wenn Sie den rootViewController Ihres self.window in Ihrem App-Delegaten bereits gesetzt haben und diesen Fehler zur Laufzeit noch erhalten, dann haben Sie wahrscheinlich mehr als ein Fenster in Ihrer UIApplication, von dem einem rootViewController möglicherweise nicht zugeordnet ist. Sie können die Anwendungsfenster durchlaufen und dem rootViewController einen leeren viewController zuordnen, um den Fehler zu beheben, den Sie erhalten.

Hier ist ein Code, der die Anwendungsfenster durchläuft und dem rootViewController einen leeren ViewController zuordnet, wenn ein Fenster fehlt.

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; 
    } 
} 

Update: Anscheinend gibt es ein Fenster in der Statusleiste gewidmet, die typischerweise um dieses Problem verursacht. Der obige Code sollte diesen Fehler beheben.

+1

Danke !! Dies stellte sich als das Problem für mich heraus. Ich hatte den Hauptansicht-Controller eingestellt, aber die App hatte ein zweites Fenster, von dem ich nichts wusste. – n13

+0

So solide ... Ich bin kein Anfänger und dieser hat mich beim Update auf Xcode 7.1 mit iOS 9.1 ... Statusleiste hat ein Fenster gewidmet ... natürlich tut es ?! Ich verstecke die Statusleiste, wenn das irgendjemandem etwas bedeutet. – whyoz

+0

Wow, ich hatte 2 von 12 meiner Apps für die Überprüfung der App abstürzen und das scheint es zu beheben. –

0

Ich habe ein älteres Projekt, das in iOS 8 aber nicht iOS 9 funktioniert. Wenn Main Interface auf MainWindow.xib eingestellt ist, aktualisieren Sie es auf ein Storyboard. Das hat es für mich behoben:

  1. Erstellen Sie ein neues Projekt, Single View Application ist in Ordnung.
  2. Kopieren Sie die Main.storyboard-Datei in Ihr Projekt, oder erstellen Sie einfach Ihre eigenen.
  3. Ihre Projekteinstellungen öffnen und zum Hauptinterface Set Set your Main Interface to Main.storyboard
1

Stellen Sie einfach Ihre RootViewController zu Navigation Main.storyboard, die wie mein Code unten Ihre UIViewController in der App-delegate.rb ist. Ich bin neu in Ruby, hoffe aber, das hat geholfen ...

rootViewController = UIViewController.alloc.init 

@window.rootViewController = navigationController 
3

Das hat mich heute auch gebissen, und es kostete mich ein paar Stunden, um es zu beheben: meine App hat das Fenster in einem „MainWindow.xib“, komplett mit Navigation-Controller und die begleitenden root-View-Controller, die waren alles automatisch in der richtigen Reihenfolge instanziiert, mit Xcode 6 und iOS8.

Auf iOS9 dass App noch gut läuft, wenn aus dem App Store heruntergeladen haben, aber nicht wenn neu 7 mit Xcode gebaut und laufen auf iOS 9. Zum Zeitpunkt der AppDelegate seine applicationDidBecomeActive ausführt: Methode die Wurzel-View-Controller ist jetzt nicht geladen, wie es früher war! Das hat den Root-View-Controller dazu gebracht, den Aufruf meines Wiederherstellungsstatuscodes zu verpassen.

Ich habe dies behoben, indem ich den Root-View-Controller selbst in Code instanziiere und seinen Zustand explizit aus der viewDidLoad wiederherstelle.

11

Es scheint, dass seit iOS 9.1 (?) Oder Xcode 7.1 jede UIWindow während application(_:didFinishLaunchingWithOptions:) Bedarf instanziiert einen rootViewController Satz haben, bevor diese Methode verlassen.

Bisher war es ausreichend, dass nur das Hauptfenster während dieser Methode eine rootViewController gesetzt hatte. Nun muss jede UIWindow Instanz eine gültige rootViewController Eigenschaft haben.

Der Täter hier könnte Ihr eigener Code sein, wenn Sie UIWindow und auch jede andere Third-Party-Bibliothek verwenden, die versucht, eine neue UIWindow Instanz während dieser Zeit zu initialisieren (wie Statusleiste Nachricht Overlays, etc.).

HINWEIS: Sie erhalten auch den gleichen Fehler, wenn Sie rootViewControler nicht auf Ihrem Hauptfenster festlegen oder wenn Ihr Storyboard nicht richtig eingerichtet ist. Erwähnen Sie dies als eine Randnotiz, da diese Fälle ziemlich offensichtlich und einfach zu beheben sind.

+0

Sie sind brillant: D, danke Mann ich nur kommentieren die Initialisierung des Fensters und alles ist OK jetzt –

1

Ich kam in dieses Problem mit einer App, die ich mehr oder weniger geerbt habe. Nachdem ich festgestellt hatte, dass das Storyboard korrekt als Hauptschnittstelle der App eingerichtet war und das Storyboard einen RootViewController hatte, kam es immer noch zum Absturz.

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

Was ich nach einigen weiteren Untersuchungen entdeckt, dass der Absturz durch eine Darstellungslogik verursacht wurde (SVProgressHud) in - (void)applicationDidBecomeActive:(UIApplication *)application genannt zu werden. Dies scheint ein neues Verhalten in Xcode7 zu sein, aber soweit ich das beurteilen kann, hat SVProgressHud den rootviewcontroller referenziert, bevor er vom Storyboard gesetzt wurde. Letztendlich wurde der Fehler behoben, indem SVProgressHud auf 2.0 aktualisiert wurde.

+0

vielen Dank, Sie haben uns gerettet .. – karthikeyan

0

Swift 2-Lösung, die für mich gearbeitet:

den Code unten Legen Sie in AppDelegate -> didFinishLaunchingWithOptions

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