webentwicklung-frage-antwort-db.com.de

Beim Ausführen eines Projekts mit Xcode 7, iOS 9 wird der Fehler "Bei Anwendungsfenstern wird am Ende des Anwendungsstarts ein Root-Ansichtscontroller erwartet"

Nachlauffunktion

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

82
andrew wang

Aus Ihrer Fehlermeldung:

Es wird erwartet, dass Anwendungsfenster am Ende des Anwendungsstarts einen Stammansichts-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];
167
James Webster

Wenn Sie den rootViewController Ihres self.window in Ihrem App-Delegaten bereits festgelegt haben und diesen Fehler zur Laufzeit immer noch erhalten, haben Sie wahrscheinlich mehr als ein Fenster in Ihrer UIApplication, dem möglicherweise kein rootViewController zugeordnet ist. Sie können Ihre App-Fenster durchlaufen und einen leeren viewController mit seinem rootViewController verknüpfen, 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 dieses Problem normalerweise verursacht. Der obige Code sollte diesen Fehler beheben.

36
Bms270

XCODE 7 setzt voraus, dass alle Windows einen rootViewController haben. Sie können easy 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)!

21
Envoy

Es scheint, dass seit iOS 9.1 (?) Oder Xcode 7.1 für jedes UIWindow, das während application(_:didFinishLaunchingWithOptions:) instanziiert wurde, ein rootViewController festgelegt werden muss, bevor diese Methode verlassen werden kann.

Bisher reichte es aus, wenn bei dieser Methode nur im Hauptfenster ein rootViewController gesetzt wurde. Jetzt muss jede UIWindow -Instanz eine gültige rootViewController -Eigenschaft haben.

Der Schuldige hier könnte Ihr eigener Code sein, wenn Sie UIWindow und jede andere Bibliothek eines Drittanbieters verwenden, die während dieser Zeit versucht, eine neue UIWindow Instanz zu initialisieren (wie Statusleisten - Nachrichtenüberlagerungen usw.) .).

NOTE : Der gleiche Fehler tritt auch auf, wenn Sie in Ihrem Hauptfenster das rootViewControler nicht einstellen oder wenn Ihr Storyboard nicht richtig eingerichtet ist . Dies als Randnotiz zu erwähnen, da diese Fälle ziemlich offensichtlich und einfach zu beheben sind.

13
lipka

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 noch einwandfrei, aber nicht wenn sie mit Xcode 7 neu erstellt und unter iOS 9 ausgeführt wird. Zur Zeit führt der App-Delegat seine applicationDidBecomeActive: -Methode auf dem Root-View-Controller aus ist jetzt nicht geladen, wie es früher war! 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 dessen Status explizit über viewDidLoad wiederhergestellt habe.

3
RickJansen

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

2
alla

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

rootViewController = UIViewController.alloc.init

@window.rootViewController = navigationController
1
BigPun86

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 für Apps eingerichtet war und ob das Storyboard über einen RootViewController verfügte, 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, ist, dass der Absturz durch einen Aufruf einer Ansichtslogik (SVProgressHud) in - (void)applicationDidBecomeActive:(UIApplication *)application verursacht wurde. Dies scheint ein neues Verhalten in Xcode7 zu sein, aber soweit ich weiß, hat SVProgressHud auf den rootviewcontroller verwiesen, bevor er vom Storyboard festgelegt wurde. Das letzte Update von SVProgressHud auf 2.0 hat den Fehler behoben.

1
Bueno

Swift 2-Lösung, die bei mir funktioniert hat:

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

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

Ich habe ein älteres Projekt, das in iOS 8, aber nicht in iOS 9 funktioniert hat. Wenn die Hauptoberfläche auf MainWindow.xib eingestellt ist, aktualisieren Sie sie 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 eine eigene.
  3. Öffnen Sie Ihre Projekteinstellungen und stellen Sie Ihre Hauptoberfläche auf Main.storyboard Set your Main Interface to Main.storyboard
0
Adrian