Fehler beim Ausführen eines Projekts mit Xcode 7, iOS 9, wird erwartet, dass Anwendungsfenster am Ende des Anwendungsstarts einen Root-View-Controller haben

89

Nach dem Ausführen der Funktion

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

Es gibt einen Absturz:

 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 kann ich tun, damit es mit Xcode 7 und iOS 9 erstellt und ausgeführt wird?

Andrew Wang
quelle
Da Xcode 7 eine Beta ist, sollten Sie für ernsthafte Entwicklungsarbeiten wahrscheinlich zu Xcode 6 zurückkehren.
Paul R
Hallo, ich bekomme diesen Fehler: - *** Assertionsfehler in - [UIApplication _runWithMainScene: TransitionContext: Vervollständigung:], /BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKit_Sim/UIKit-3505.16/UIApplication.m: 3294 wie man das löst
Akash Raghani

Antworten:

175

Aus Ihrer Fehlermeldung:

Es wird erwartet, dass Anwendungsfenster am Ende des Anwendungsstarts einen Root-View-Controller haben

Wie alt ist dieses "alte" Projekt? Wenn es mehr als ein paar Jahre sind, haben Sie noch:

[window addSubview:viewController.view];

Sie sollten es stattdessen ersetzen durch:

[window setRootViewController:viewController];
James Webster
quelle
1
Ich habe das gleiche Problem und ich denke, es ist ein iOS 9-Problem. Mein Projekt funktioniert unter iOS 7 und 8. Aus irgendeinem Grund ist die Ansicht aus dem Storyboard nicht richtig eingestellt.
David Snabel-Caunt
3
Vielen Dank . Die Antwort ist in der Fehlermeldung: "Anwendungsfenster" Ich finde, es gibt zwei Fenster in meinem Projekt, eines ist normale Witwe, das andere ist ein Modual eines Drittanbieters namens
Andrew Wang
3
MTStatusBarOverlay und es hat keinen RootViewController, iOS9 erfordert, dass das gesamte Fenster einen rootViewController hat.
Andrew Wang
1
Ja, ich habe schließlich das gleiche Problem gefunden. Meine App verfügt über ein zusätzliches Fenster ohne Root-View-Controller.
David Snabel-Caunt
1
Ich habe die Lösung gefunden, die für mich funktioniert: stackoverflow.com/a/32719949/1881895
Barrast
36

Wenn Sie den rootViewController Ihres self.window bereits in Ihrem App-Delegaten festgelegt haben und diesen Fehler zur Laufzeit weiterhin erhalten, ist in Ihrer UIApplication wahrscheinlich mehr als ein Fenster vorhanden, dem möglicherweise kein rootViewController zugeordnet ist. Sie können Ihre App-Fenster durchlaufen und einen leeren viewController seinem rootViewController zuordnen, um den Fehler zu beheben, den Sie erhalten.

Hier ist ein Code, der die App-Fenster 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 für die Statusleiste, das normalerweise dieses Problem verursacht. Der obige Code sollte diesen Fehler beheben.

Bms270
quelle
2
Vielen Dank!! Dies stellte sich für mich als Problem heraus. Ich hatte den Hauptansichts-Controller eingestellt, aber die App hatte ein zweites Fenster, von dem ich nichts wusste.
n13
So solide ... Ich bin kein Neuling und dieser hat mich beim Aktualisieren auf Xcode 7.1 mit iOS 9.1 erwischt ... Die Statusleiste hat ein eigenes Fenster ... natürlich?! Ich verstecke die Statusleiste, wenn das für irgendjemanden etwas bedeutet.
Whyoz
Wow, ich hatte 2 von 12 meiner Apps, die für die App-Überprüfung abstürzten, und dies scheint das Problem zu beheben.
Andrew Smith
Hat super funktioniert !! Ich muss lieben "Anscheinend gibt es ein Fenster für die Statusleiste, das normalerweise dieses Problem verursacht." Ich habe das NICHT kommen sehen.
eGanges
1
Diese Methode kann dazu führen, dass viewDidLoad und viewWillAppear auf Ihrem rootViewController zweimal aufgerufen werden. Wenn Sie ein manuell initiiertes Fenster haben, überprüfen Sie Ihre Liste und stellen Sie sicher, dass Window.xib NICHT als "Hauptname der NIB-Dateibasis" definiert ist, wenn nach Verwendung dieser Problemumgehung zweimal Aufrufe angezeigt werden. Dann müssen Sie nur noch diesen Code entfernen und den RootViewController wie gewohnt einstellen.
Whyoz
21

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

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

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

Gesandte
quelle
Willkommen bei Stack Overflow! Bitte überlegen Sie, Ihren Beitrag zu bearbeiten, um weitere Erklärungen darüber hinzuzufügen, was Ihr Code tut und warum er das Problem löst. Eine Antwort, die meistens nur Code enthält (auch wenn sie funktioniert), hilft dem OP normalerweise nicht, ihr Problem zu verstehen.
SuperBiasedMan
Vielen Dank, das hat meine iOS ~ 3–8-Warnung vermieden => iOS 9-Absturz, aber eine Warnung des statischen Analysators über ein Leck ausgegeben. Also habe ich die Deklaration mit der Zuweisung in applicationDidFinishLaunching auf die Schnittstelle im Header verschoben. Ich habe dann [vc release] zu dealloc hinzugefügt.
Flash Sheridan
13

Es scheint, dass seit iOS 9.1 (?) Oder Xcode 7.1 alle UIWindowInstanzen, die während instanziiert application(_:didFinishLaunchingWithOptions:)wurden, einen rootViewControllerSatz benötigen, bevor diese Methode verlassen wird.

Bisher war es ausreichend, dass nur das Hauptfenster rootViewControllerwährend dieser Methode einen Satz hatte. Jetzt muss jede UIWindowInstanz eine gültige rootViewControllerEigenschaft haben.

Der Schuldige hier könnte Ihr eigener Code sein, wenn Sie UIWindoweine andere Bibliothek eines Drittanbieters verwenden, die versucht, UIWindowwährend dieser Zeit eine neue Instanz zu initialisieren (z. B. Nachrichtenüberlagerungen in der Statusleiste usw.).

HINWEIS : Der gleiche Fehler wird auch angezeigt, wenn Sie das nicht in rootViewControlerIhrem Hauptfenster festlegen oder wenn Ihr Storyboard nicht richtig eingerichtet ist. Erwähnen Sie dies als Randnotiz, da diese Fälle ziemlich offensichtlich und einfach zu beheben sind.

Lipka
quelle
Sie sind brillant: D, danke Mann, ich kommentiere nur die Initialisierung des Fensters und alles ist jetzt in Ordnung
Mohammed Alabid
3

Das hat mich auch heute gebissen und es hat mich ein paar Stunden gekostet, es zu reparieren: Meine App hat das Fenster in einer "MainWindow.xib", komplett mit Navigations-Controller und zugehörigem Root-View-Controller, die alle automatisch in der richtigen Reihenfolge instanziiert wurden , mit Xcode 6 und iOS8.

Unter iOS9 läuft diese App beim Herunterladen aus dem AppStore weiterhin einwandfrei, jedoch nicht, wenn sie neu mit Xcode 7 erstellt und unter iOS 9 ausgeführt wird. Zum Zeitpunkt, zu dem der App-Delegat seine applicationDidBecomeActive: -Methode ausführt, wird der Root-View-Controller jetzt nicht mehr geladen war früher! Dadurch hat der Root-View-Controller den Aufruf meines Wiederherstellungsstatuscodes verpasst.

Ich habe dies behoben, indem ich den Root-View-Controller selbst im Code instanziiert und seinen Status explizit aus viewDidLoad wiederhergestellt habe.

RickJansen
quelle
2

Sie sollten die rootviewcontroller-Eigenschaft jedes Fensters in Ihrer App festlegen

alla
quelle
Ihre Antwort hat mir geholfen
Aznix
2

Ich habe ein älteres Projekt, das in iOS 8 funktioniert hat, aber nicht in iOS 9. Wenn Ihre Hauptschnittstelle 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 Datei Main.storyboard in Ihr Projekt, oder erstellen Sie einfach Ihre eigene.
  3. Öffnen Sie Ihre Projekteinstellungen und setzen Sie Ihre Hauptschnittstelle auf Main.storyboard Stellen Sie Ihre Hauptschnittstelle auf Main.storyboard ein
Adrian
quelle
1

Stellen Sie einfach Ihren rootViewController auf navigationController ein, der Ihr UIViewController in der app-delegate.rb ist, wie mein Code unten. Ich bin neu in Ruby, hoffe aber, dass dies geholfen hat ...

rootViewController = UIViewController.alloc.init

@window.rootViewController = navigationController
BigPun86
quelle
1

Ich bin mit einer App auf dieses Problem gestoßen, die ich mehr oder weniger geerbt habe. Nachdem ich überprüft hatte, ob das Storyboard ordnungsgemäß als Hauptschnittstelle der Apps 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 herausgefunden habe, dass der Absturz durch das Aufrufen einer Ansichtslogik (SVProgressHud) verursacht wurde - (void)applicationDidBecomeActive:(UIApplication *)application. Dies scheint ein neues Verhalten in Xcode7 zu sein, aber soweit ich das beurteilen kann, hat SVProgressHud auf den rootviewcontroller verwiesen, bevor er vom Storyboard festgelegt wurde. Durch die Aktualisierung von SVProgressHud auf 2.0 wurde der Fehler behoben.

Bueno
quelle
0

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

Fügen Sie den folgenden Code in AppDelegate -> didFinishLaunchingWithOptions ein

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

Fox5150
quelle