Errore "Si prevede che le finestre dell'applicazione abbiano un controller di visualizzazione principale alla fine dell'avvio dell'applicazione" durante l'esecuzione di un progetto con Xcode 7, iOS 9


89

Dopo aver eseguito la funzione

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

c'è un crash:

 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

Questo progetto è un vecchio progetto, cosa devo fare per costruirlo ed eseguirlo con Xcode 7 e iOS 9?


Poiché Xcode 7 è una beta, dovresti probabilmente tornare a Xcode 6 per qualsiasi lavoro di sviluppo serio.
Paul R


ciao sto ottenendo questo eroor: - *** Errore di asserzione in - [UIApplication _runWithMainScene: TransitionContext: completamento:], /BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKit_Sim/UIKit-3505.16/UIApplication.m: 3294 come risolvere questo problema
Akash Raghani

Risposte:


175

Dal tuo messaggio di errore:

Si prevede che le finestre dell'applicazione abbiano un controller di visualizzazione radice alla fine del lancio dell'applicazione

Quanti anni ha questo "vecchio" progetto? Se sono trascorsi più di qualche anno, hai ancora:

[window addSubview:viewController.view];

Dovresti invece sostituirlo con:

[window setRootViewController:viewController];

1
Ho lo stesso problema e penso che sia un problema di iOS 9. Il mio progetto funziona su iOS 7 e 8. Per qualche motivo la visualizzazione dallo storyboard non è impostata correttamente.
David Snabel-Caunt

3
Grazie mille . la risposta è nel messaggio di errore: "Finestre dell'applicazione" Trovo che ci siano due finestre nel mio progetto, una è normale widdow, l'altra è un modulo di terze parti chiamato
andrew wang

3
MTStatusBarOverlay e non ha un RootViewController, iOS9 richiede che tutta la finestra abbia un rootViewController.
andrew wang

1
Sì, alla fine ho riscontrato lo stesso problema. La mia app ha una finestra aggiuntiva che non ha un controller di visualizzazione principale.
David Snabel-Caunt

1
Ho trovato la soluzione che lavora per me: stackoverflow.com/a/32719949/1881895
barrast

37

Se hai già impostato il rootViewController della tua self.window nel tuo delegato dell'app e ricevi ancora questo errore in fase di esecuzione, probabilmente hai più di una finestra nella tua applicazione UIA, una delle quali potrebbe non avere un rootViewController associato. Puoi scorrere le finestre dell'app e associare un viewController vuoto al suo rootViewController per correggere l'errore che stai ricevendo.

Ecco un codice che scorre attraverso le finestre dell'app e associa un ViewController vuoto a rootViewController se manca una finestra.

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

Aggiornamento: Apparentemente c'è una finestra dedicata alla barra di stato che in genere causa questo problema. Il codice sopra dovrebbe correggere questo errore.


2
Grazie!! Questo si è rivelato essere il problema per me. Avevo impostato il controller di visualizzazione principale, ma l'app aveva una seconda finestra di cui non ero a conoscenza.
n13

Così solido ... Non sono un principiante e questo mi ha ottenuto durante l'aggiornamento a Xcode 7.1 con iOS 9.1 ... la barra di stato ha una finestra dedicata ... certo che lo fa ?! Nascondo la barra di stato se questo significa qualcosa per qualcuno.
whyoz

Wow, ho avuto 2 delle 12 app che si bloccavano per la revisione dell'app e questo sembra risolverlo.
Andrew Smith

Ha funzionato alla grande !! Devo amare "Apparentemente c'è una finestra dedicata alla barra di stato che in genere causa questo problema." NON l'ho visto arrivare.
eGanges

1
Questo metodo può comportare che viewDidLoad e viewWillAppear vengano chiamati due volte su rootViewController. Se hai una finestra di inizializzazione manuale, controlla il tuo plist e assicurati di NON avere il Window.xib definito come "Nome base del file pennino principale" se vedi cose chiamate due volte dopo aver usato questa soluzione alternativa. Quindi devi solo rimuovere questo codice e impostareRootViewController come faresti normalmente.
whyoz

21

XCODE 7 richiede che tutte le finestre debbano avere un rootViewController Puoi usare easy:

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

Funziona bene se devi usare solo UIWindow (per semplici esempi da qualsiasi Tutorial - prima di Xcode 7)!


Benvenuto in Stack Overflow! Considera la possibilità di modificare il tuo post per aggiungere ulteriori spiegazioni su cosa fa il tuo codice e perché risolverà il problema. Una risposta che per lo più contiene solo codice (anche se funziona) di solito non aiuta l'OP a capire il problema.
SuperBeddingMan

Grazie, questo ha evitato il mio avviso iOS ~ 3–8 => iOS 9 in crash, ma ha dato un avviso di analizzatore statico su una perdita. Quindi ho spostato la dichiarazione nell'interfaccia nell'intestazione, con l'assegnazione in applicationDidFinishLaunching. Ho quindi aggiunto [vc release] a dealloc.
Flash Sheridan

13

Sembra che da iOS 9.1 (?) O Xcode 7.1 qualsiasi UIWindowistanza durante application(_:didFinishLaunchingWithOptions:)deve avere un rootViewControllerset prima di abbandonare quel metodo.

In precedenza era sufficiente che solo la finestra principale avesse un rootViewControllerset durante quel metodo. Ora ogni UIWindowistanza deve avere una rootViewControllerproprietà valida .

Il colpevole qui potrebbe essere il tuo codice se usi UIWindowe anche qualsiasi altra libreria di terze parti che tenta di inizializzare una nuova UIWindowistanza durante questo periodo (come gli overlay dei messaggi della barra di stato, ecc.).

NOTA : si ottiene lo stesso errore anche se non si imposta nella rootViewControlerfinestra principale o se lo storyboard non è impostato correttamente. Menzionando questo come una nota a margine poiché quei casi sono abbastanza ovvi e semplici da risolvere.


Sei geniale: D, grazie amico, ho appena commentato l'inizializzazione della finestra e tutto è OK ora
mohammad alabid

3

Questo mi ha morso anche oggi, e mi è costato qualche ora per risolverlo: la mia App ha la finestra in una "MainWindow.xib", completa di controller di navigazione e controller di root view associato, che sono stati tutti istanziati automaticamente nell'ordine corretto , con Xcode 6 e iOS8.

Su iOS9 quell'app funziona ancora bene quando viene scaricata dall'AppStore, ma non quando è stata creata di recente con Xcode 7 ed eseguita su iOS 9. Al momento il delegato dell'app sta eseguendo la sua applicazioneDidBecomeActive: metodo il controller della vista principale non è ora caricato, poiché era prima! Ciò ha fatto sì che il controller della vista root mancasse la chiamata al mio codice di stato di ripristino.

Ho risolto questo problema istanziando personalmente il controller della vista radice, nel codice e ripristinando il suo stato da viewDidLoad, in modo esplicito.


2

Devi impostare la proprietà rootviewcontroller di ogni finestra nella tua app


La tua risposta mi ha aiutato
Aznix

2

Ho un vecchio progetto che funzionava in iOS 8 ma non in iOS 9. Se la tua interfaccia principale è impostata su MainWindow.xib, aggiornala su uno storyboard. Questo lo ha risolto per me:

  1. Crea un nuovo progetto, l'applicazione a visualizzazione singola va bene.
  2. Copia il file Main.storyboard nel tuo progetto o puoi semplicemente crearne uno tuo.
  3. Apri le impostazioni del progetto e imposta la tua interfaccia principale su Main.storyboard Imposta la tua interfaccia principale su Main.storyboard

1

Basta impostare rootViewController su navigationController che è il tuo UIViewController nell'app-delegate.rb come il mio codice qui sotto. Sono nuovo in Ruby ma spero che questo abbia aiutato ...

rootViewController = UIViewController.alloc.init

@window.rootViewController = navigationController

1

Sono entrato in questo problema con un'app che ho ereditato più o meno. Dopo aver verificato che lo storyboard fosse impostato correttamente come interfaccia principale delle app e che lo storyboard avesse un RootViewController, stavo ancora riscontrando l'arresto anomalo.

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

Quello che ho scoperto dopo ulteriori indagini è che il crash era stato causato da una logica di visualizzazione (SVProgressHud) chiamata - (void)applicationDidBecomeActive:(UIApplication *)application. Questo sembra essere un nuovo comportamento in Xcode7 ma per quanto posso dire a SVProgressHud faceva riferimento al rootviewcontroller prima che fosse impostato dallo storyboard. Infine l'aggiornamento di SVProgressHud alla 2.0 ha risolto il bug.


0

Soluzione Swift 2 che ha funzionato per me:

Inserisci il codice sottostante in AppDelegate -> didFinishLaunchingWithOptions

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.