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


383

Ottengo il seguente errore nella mia console:

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

Di seguito è il mio application:didFinishLaunchWithOptionsmetodo:

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

    // Set Background Color/Pattern
    self.window.backgroundColor = [UIColor blackColor];
    self.tabBarController.tabBar.backgroundColor = [UIColor clearColor];
    //self.window.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"testbg.png"]];

    // Set StatusBar Color
    [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleBlackTranslucent];

    // Add the tab bar controller's current view as a subview of the window
    self.window.rootViewController = self.tabBarController;
    [self.window makeKeyAndVisible];
    return YES;
}

In Interface Builder, il UITabBarControllerdelegato del è collegato al delegato dell'app.

Qualcuno sa come risolvere questo problema?


5
Esegui un NSLog di self.tabBarController subito prima di eseguire l'assegnazione. Il messaggio viene attivato solo se il controller è zero. Se è zero e hai verificato che le connessioni siano corrette, prova a creare un'istanza del controller nel codice.
FeifanZ,

cercare di commentare l'inizializzazione della finestra .. controllare questa risposta stackoverflow.com/a/33958144/1293445
Mohammad alabid

Risposte:


188

Ho avuto lo stesso problema. Controlla il tuo main.m. L'ultimo argomento dovrebbe essere impostato sul nome della classe che implementa il protocollo UIApplicationDelegate.

retVal = UIApplicationMain(argc, argv, nil, @"AppDelegate");

49
Un'altra opzione è assicurarsi che la classe delegata dell'app sia importata in main e in uso NSStringFromClass. Ecco come Xcode ora crea il file main.m. Ad esempio: #import "AppDelegate.he poiint retVal = UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
sho il

10
assicurarsi che self.windowsia inizializzato comeself.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
Raptor

1
Ho provato le opzioni di cui sopra, non ha funzionato per me. E non sto usando uno storyboard.
jowie,

3
Non ha avuto alcun effetto per me, lo stesso messaggio "Le applicazioni sono previste ..." dopo aver apportato la modifica. La soluzione è stata la risposta di OrdoDei (vedi sopra o sotto) che ha funzionato perfettamente.
Andrew,

1
Se vedi una vista bianca nel Simulatore ma ti aspetti di vedere il layout da uno storyboard assicurati di esserti sbarazzato del codice nella tua funzione di delegato root "application didFinishLaunchingWithOptions ..." che è indicata in main.m e ha solo "return SÌ;" dentro.
Olivier de Jonge,

435

Sostituisci in AppDelegate

 [window addSubview:[someController view]];

per

  [self.window setRootViewController:someController];

Questo mi ha sbarazzato del messaggio per me. Non mostra ancora una finestra successiva ma potrebbe trattarsi di un problema diverso. Grazie.
Jazzmine,

3
Se stai usando un UINavigationController, dovresti prima [[UINavigationController] initWithRootViewController: tableViewController] e quindi utilizzare il codice sopra [self.window setRootViewController: self.navigationController] per impostare il controller di visualizzazione radice della finestra
emdog4

Cocos2d ha un commento che dice "// AddSubView non funziona su iOS6" Quindi questo mi ha risolto, dato che sto usando iOS 6.
Almo,

1
La addSubviewlinea faceva parte del modello di progetto in una versione iniziale di Xcode / iOS SDK. Se l'app risale a molto tempo fa, potresti averla anche se non l'hai scritta.
Seva Alekseyev,

ciao, sto ottenendo questo eroor: - *** Asserzione non riuscita in - [UIApplication _runWithMainScene: transizioneContext: completamento:], /BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKit_Sim/UIKit-3505.16/UIApplication.m: 3294 come risolverlo
Akash Raghani,

70

Ho avuto lo stesso errore durante il tentativo di modificare il primo controller di visualizzazione caricato

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

All'inizio non sapevo da dove provenisse esattamente l'errore, quindi l'ho ristretto e ho scoperto cosa è andato storto. Si è scoperto che stavo cercando di cambiare la visualizzazione di una vista prima che venisse effettivamente visualizzata sullo schermo. La soluzione era quindi quella di spostare questo codice nel viewcontroller che mi stava dando problemi

- (void)viewDidLoad

per

- (void)viewDidAppear:(BOOL)animated

e l'errore ha smesso di apparire. Il mio problema è stato causato in particolare dallo UIAlertViewspettacolo.

Nel tuo caso ti suggerisco di controllare il codice nel controller di visualizzazione attiva di tabBarController (poiché probabilmente è un problema in quel controller di visualizzazione). Se il problema persiste, prova a configurare le impostazioni di avvio nel file pennino invece che nel codice - o se vuoi farlo nel codice, prova a spostare il codice nel metodo appropriato del viewcontroller attivo di tabBarController.

In bocca al lupo!


1
Warkst, grazie per la risposta. Nel mio caso, non riesco a spostare il codice da viewDidLoad:(senza aggiungere un flag), né dovrei farlo. Indipendentemente da ciò, grazie per il suggerimento!
ArtSabintsev,

2
L'ho trovato oggi e sono contento di averlo fatto - lo stesso problema - stava mostrando a uialert un lancio in viewDidLoad. Modificato per visualizzareDidAppear e funziona bene. Non sono sicuro di ciò che Apple ottiene di più, modificandolo in iOS5.
GuybrushThreepwood,

Grazie per il suggerimento che la visualizzazione di avviso stava causando, lo stesso problema si è verificato anche a me.
Chris

1
Potresti dirci quale codice hai dovuto rimuovere per risolverlo? Sto usando il mio viewDidLoadper molte cose, impostando tutte le cose per la prima volta, come l'aggiunta di dati a UITableView. Non riesco a spostarlo viewDidAppear:perché voglio solo sparare una volta.
jowie,

1
Il problema non era la funzione sbagliata. Il problema era che ti stavi dimenticando di chiamare [super viewDidLoad] nella tua funzione viewDidLoad, uccidendo efficacemente il carico del pennino. La stessa cosa mi è successa più di una volta.
Borrrden,

47

Ho ottenuto questo quando si inizia con il modello "Applicazione vuota" e quindi aggiungendo manualmente un XIB. L'ho risolto impostando il nome del pennino principale come suggerito da Sunny. Il passaggio mancante in questo scenario è la rimozione

self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];

a partire dal

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

Come sovrascriverà l'istanza della tua finestra creata nel file Xib. Ciò presuppone che tu abbia creato un ViewController e lo abbia cablato con la finestra e il delegato dell'app anche nel file XIB.


Questo ha risolto anche per me. Stavo usando un'applicazione a schede con uno Storyboard a cui stavo cercando di aggiungere CoreData e ho riscontrato questo problema.
gitaarik,

lol se aggiungo questo ricevo due avvertimenti che ci si aspetta che le finestre dell'applicazione abbiano un controller di visualizzazione radice !!
George Asda,

46

Questo mi è successo. Risolto modificando il file .plist. Specificare il nome base del file pennino principale (dovrebbe essere MainWindow.xib). Spero che questo possa aiutare.

inserisci qui la descrizione dell'immagine


2
Questo ha funzionato per me! Questo funziona quando si crea un progetto vuoto in Xcode 4.2, dove non sarà presente MainWindow e in questo modo dobbiamo collegarlo.
Jeevangs,

Il problema si è verificato quando inavvertitamente abbiamo eliminato la riga "Nome base file pennino principale" dal file "Info.plist". L'inserimento di questa riga risolto il problema.
rtovars,

Puoi anche impostarlo nelle proprietà del progetto. Seleziona il progetto, il tuo obiettivo, puoi modificarlo in Riepilogo -> Informazioni sulla distribuzione di iPhone / iPad.
doekman,

questo era in realtà il problema per me, che portava a molteplici problemi relativi alla chiamata viewDidLoad e viewWillAppear due volte su rootViewController. Nel mio caso, rimuovere questa era la soluzione
whyoz,

27

Di recente ho riscontrato lo stesso problema durante la creazione di un progetto con iOS5 SDK. Inizialmente si stava costruendo e funzionando correttamente, ma successivamente è apparso l'errore.
Nel mio caso la soluzione era piuttosto semplice.
Ciò che mancava era che in qualche modo la proprietà Interfaccia principale nella scheda di riepilogo della mia destinazione dell'applicazione veniva cancellata. Quindi ho dovuto impostarlo di nuovo.


Se non è questo il punto e se tabBarController è ancora nullo, puoi sempre creare a livello di programmazione la finestra e il controller di root. Come fallback ho aggiunto il seguente codice al mio progetto

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{ 
    if (!window && !navigationController) {
        NSLog(@"Window and navigation controller not loaded from nib. Will be created programatically.");
        self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
        UIViewController *viewController1, *viewController2;
        viewController1 = [[[FirstViewController alloc] initWithNibName:@"FirstViewController_iPhone" bundle:nil] autorelease];
        viewController2 = [[[SecondViewController alloc] initWithNibName:@"SecondViewController_iPhone" bundle:nil] autorelease];

        self.tabBarController = [[[UITabBarController alloc] init] autorelease];
        self.tabBarController.viewControllers = [NSArray arrayWithObjects:viewController1, viewController2, nil];
        self.window.rootViewController = self.tabBarController;

    }
    else {
        [window addSubview:[tabBarController view]];
    }
    [self.window makeKeyAndVisible];
    return YES;
}

Funzionerà solo se viene implementata anche la soluzione sho.


24

Ho eseguito l'aggiornamento a iOS9 e ho iniziato a ottenere questo errore dal nulla. Sono stato in grado di risolverlo ma aggiungendo il codice seguente a- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

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

Sono curioso di sapere quante finestre aveva la tua app e se tutte avevano un controller di visualizzazione root. Grazie
DrAL3X il

5
NOTA : questa risposta è una soluzione alternativa e non risolve la causa principale. Vedere stackoverflow.com/a/33958144/1116061
Lipka

Sei un vero eroe!
user2161301,

21

Nessuno dei suggerimenti di cui sopra ha risolto il mio problema. Il mio era questo:

Inserisci:

window.rootViewController = navigationController;

dopo:

[window addSubview:navigationController.view];

nel mio delegato di app

- (void)applicationDidFinishLaunching:(UIApplication *)application {

20
  • Seleziona la tua "finestra" nel tuo file pennino
  • In "Ispettore attributi" Seleziona "Visibile all'avvio"

Immagine![]

  • Questo succede quando il tuo file pennino viene creato manualmente.
  • Questa correzione funziona per la normale modalità pennino, non per la modalità storyboard

Questo si trova solo nella modalità Storyboard, credo.
ArtSabintsev il

No, questo progetto era in modalità pennino normale. Questa è una schermata della modalità Storyboard. "Visibile all'avvio" vs. "Is Initial View Controller".
bearMountain

3
Se il file del pennino della finestra creato manualmente e "visibile all'avvio" è deselezionato per impostazione predefinita, verrà visualizzato questo messaggio dopo l'avvio dell'app, questo risolve il mio problema!
ZYiOS l'

OH GRAZIE!!! Finalmente una soluzione a questo fastidioso avvertimento. Anche se hai makeKeyAndVisiblenon risolve il problema. SOLO questo ha risolto l'avvertimento per me. GRAZIE!
tacos_tacos_tacos,

'Questo succede nella normale modalità pennino - non nella modalità storyboard` Non molto vero. Sto affrontando lo stesso problema Storyboardanche con
thesummersign

19

come aggiungere un RootViewController per iOS5

se la tua app non ha utilizzato un RootViewController fino ad ora, creane uno;) premendo File> Nuovo> Nuovo file; seleziona il UIViewController subclass nome RootViewController , deseleziona l'interfaccia utente Con XIB per (supponendo che tu ne abbia già uno) e inserisci questo codice in AppDelegate :: didFinishLaunchingWithOptions

rootViewController = [[RootViewController alloc] init];
window.rootViewController = rootViewController;

sicuramente - devi importare RootViewController.h e creare la variabile

ecco un bell'articolo su RootViewController e AppDelegate,


Il link dell'articolo su cupsofcocoa.com è morto - hai idea di se ce ne sia una copia da qualche parte?
Ríomhaire,

1
questo è stato spostato su binpress.com, aggiornato il link nella risposta
rémy

Questo è un ottimo collegamento. Buona lettura e spiega cosa sta succedendo. Ho riscontrato questo problema anche usando un vecchio libro (dal momento che voglio imparare prima Objective-C) ma scrivendo codice sull'ultimo XCode 7, che non ha i modelli più vecchi.
ibaralf,

11

Ho anche avuto questo errore ma a differenza di una qualsiasi delle risposte precedentemente elencate, la mia era perché avevo decommentato il metodo 'loadView' nel mio controller appena generato (xcode 4.2, ios5).

 //Implement loadView to create a view hierarchy programmatically, without using a nib.
- (void)loadView  
{
}

Mi ha anche detto che il metodo era per creare la vista a livello di codice ma l'ho persa perché sembrava così simile ad altri metodi come viewDidLoad che normalmente uso non l'ho preso.

Per risolvere semplicemente rimuovi quel metodo se non stai creando a livello di programmazione la gerarchia della vista, ovvero usando pennino o storyboard.


Posso confermare che ciò può causare il problema. Ho avuto la stessa situazione seguendo il tutorial su TableView in cui creano i delegati in loadView. Dopo aver spostato quel codice su viewDidLoad e aver rimosso loadView, tutto ha iniziato a funzionare secondo necessità.
Eugen,

È ancora possibile utilizzare la vista di caricamento ma aggiungere [super loadView]; all'inizio.
Hermann Klecker,

1
Hmm ... la documentazione per loadView afferma specificamente che non dovresti chiamare il metodo super.
Joshua Sullivan,

Ho scavalcato l'UIViewController predefinito in uno storyboard e ho scoperto che il codice modello per la creazione di una sottoclasse UIViewController ha loadView abilitato di default causando questo per me ... sprecato più di un'ora su questa cosa sciocca. Grazie per aver pubblicato questo!
slycrel,

11

ho anche questo problema. ho eseguito il mio progetto in xcode4.2.1. ho letto tutti i commenti lassù, ma nessuno è forte per me. dopo un po ', scopro di aver commentato un pezzo di codice.

//self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];

poi l'ho decommentato. tutto ok per me. spero che questo sarebbe utile per voi ragazzi.


Il codice: "self.window = [[UIWindow alloc] initWithFrame: [[UIScreen mainScreen] bounds]];" causa un errore, quindi l'ho appena eliminato.
Grigori A.

11

Assicurarsi di disporre di questa funzione nel delegato dell'applicazione.

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:    (NSDictionary *)launchOptions {
   return YES;
}

Assicurarsi che didFinishLaunchingWithOptions restituisca SÌ. Se ti è capitato di rimuovere la riga 'return YES', questo causerà l'errore. Questo errore può essere particolarmente comune tra gli utenti dello storyboard.


tanti complimenti, questo è quello che volevo (progetto vuoto con storyboard)
Shtirlic

2
Anch'io. Grazie. Se si crea un'applicazione vuota, questo metodo viene riempito con la creazione manuale della finestra. Questo dovrebbe essere cambiato per restituire semplicemente SÌ. Grazie
Ben G,

10

Con il mio primo punto di vista MenuViewControllerho aggiunto:

MenuViewController *menuViewController = [[MenuViewController alloc]init];
self.window.rootViewController = menuViewController;

sul metodo Delegato app:

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

Ha funzionato


10

C'è stato un leggero cambiamento in iOS 5.0 o giù di lì, che richiede di avere un controller di visualizzazione root. Se il codice si basa su un codice di esempio precedente, come GLES2Sample , in questi esempi di codice non è stato creato alcun controller di visualizzazione radice.

Per risolvere il problema (quel GLES2Sample, per esempio), applicationDidFinishLaunchingho creato un controller per la vista radice e allego il mio glView.

- (void) applicationDidFinishLaunching:(UIApplication *)application
{
  // To make the 'Application windows are expected
  // to have a root view controller
  // at the end of application launch' warning go away,
  // you should have a rootviewcontroller,
  // but this app doesn't have one at all.
  window.rootViewController = [[UIViewController alloc] init];  // MAKE ONE
  window.rootViewController.view = glView; // MUST SET THIS UP OTHERWISE
  // THE ROOTVIEWCONTROLLER SEEMS TO INTERCEPT TOUCH EVENTS
}

Questo fa sparire l'avvertimento e non influisce in alcun modo sulla tua app.


9

Prova a connettere IBOutlet del controller della barra delle schede alla vista principale in Interface Builder invece che

self.window.rootViewController = self.tabBarController;

Ma in realtà non ho mai visto un simile errore prima.


8

Ho risolto il problema procedendo come segue (nessuna delle altre soluzioni di cui sopra ha aiutato):

Dal menu a discesa associato a "Interfaccia principale" selezionare un'altra voce e selezionare nuovamente "Finestra principale", quindi ricostruire.

inserisci qui la descrizione dell'immagine


8

Mi sono imbattuto nello stesso problema ma lo stavo usando storyboard

Assegnare il mio storyboard InitialViewControlleralla mia finestra rootViewController.

In

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{
...
UIStoryboard *stb = [UIStoryboard storyboardWithName:@"myStoryboard" bundle:nil];
self.window.rootViewController = [stb instantiateInitialViewController];
return YES;
}

e questo ha risolto il problema.


7

Ho iniziato ad avere lo stesso problema subito dopo l'aggiornamento a Xcode 4.3, e solo quando ho avviato un progetto da zero (ad esempio, creare un progetto vuoto, quindi creare un UIViewController e quindi creare un file pennino separato).

Dopo aver inserito TUTTE le linee a cui ero abituato e assicurandomi di avere le connessioni corrette, continuavo a ricevere quell'errore e il file pennino che stavo cercando di caricare attraverso il controller di visualizzazione (che era impostato come rootController) non veniva mai mostrato nel simulatore.

Ho creato un modello a vista singola tramite Xcode e l'ho confrontato con il mio codice e finalmente ho riscontrato il problema!

Xcode 4.3 sembra aggiungere di default il metodo - (void) loadView; alla sezione di implementazione del controller di visualizzazione. Dopo aver letto attentamente i commenti al suo interno, divenne chiaro quale fosse il problema. Il commento indicava di sostituire il metodo loadView se si creava una vista a livello di codice (e sto parafrasando), altrimenti NON di sostituire loadView se si utilizza un pennino. Non c'era nient'altro all'interno di questo metodo, quindi in effetti stavo scavalcando il metodo (e non facendo nulla) DURANTE l'uso di un file pennino, che ha dato l'errore.

La SOLUZIONE era rimuovere completamente il metodo loadView dalla sezione di implementazione o chiamare il metodo parent aggiungendo [super loadView].

Rimuoverlo sarebbe meglio se si utilizza un file NIB poiché l'aggiunta di qualsiasi altro codice lo sovrascriverà.


quello era esattamente il mio problema! Avevo aggiunto un'implementazione di loadView ma non ho chiamato super. Sono state apportate altre modifiche al codice, non ricordo cosa diavolo ho fatto. Mi ha bloccato per 2 ore perché quel cambiamento sembrava così innocuo.
LearnCocos2D

6

Ho avuto questo stesso messaggio di errore nel registro. Ho avuto un pop-up UIAlertView nell'applicazione: didFinishLaunchingWithOptions. L'ho risolto ritardando la chiamata a alertView per consentire al controller di visualizzazione principale di terminare il caricamento.

In applicazione: didFinishLaunchingWithOptions:

[self performSelector:@selector(callPopUp) withObject:nil afterDelay:1.0];

che chiama dopo 1 secondo:

- (void)callPopUp
{
    // call UIAlertView
}

Grazie, questo ha risolto il mio problema. Devi attendere per mostrare l'avviso fino a quando la finestra non viene caricata. Nel mio caso ho appena fatto [alert performSelector: @selector (show) withObject: nil afterDelay: 1.0];
deepwinter

6

Ho avuto lo stesso problema. Se stai creando un'applicazione per finestre "da zero" come ero, dovrai fare quanto segue: (nota, questi sono i passaggi per Xcode 4.2.)

0. Assicurarsi che il delegato dell'applicazione sia conforme al protocollo UIApplicationDelegate.

Ad esempio, supponiamo che il nostro delegato si chiami MyAppDelegate. In MyAppDelegate.h, dovremmo avere qualcosa del genere:

@interface MyAppDelegate : 
    NSObject <UIApplicationDelegate> // etc...

1. Specificare il delegato dell'applicazione in main.m

Per esempio,

#import "MyAppDelegate.h"

int main(int argc, char *argv[])
{
  @autoreleasepool {
    return UIApplicationMain(argc, argv,
      nil, NSStringFromClass([MyAppDelegate class]));
  }
}

2. Creare un file di interfaccia della finestra principale.

Per fare ciò, fai clic con il pulsante destro del mouse sul tuo progetto e scegli Nuovo file. Da lì, scegli Window dalla sezione iOS -> Interfaccia utente.

Dopo aver aggiunto il file al progetto, vai al riepilogo del progetto (fai clic con il pulsante sinistro del mouse sul progetto; fai clic sul riepilogo.) In Informazioni sulla distribuzione di iPhone / iPod (e la sezione iPad corrispondente, se lo desideri) e seleziona il tuo nuovo file di interfaccia in " Casella combinata "Interfaccia principale".

3. Collega tutto nell'editor dell'interfaccia

Seleziona il file dell'interfaccia nell'elenco dei file per visualizzare l'editor dell'interfaccia.

Assicurarsi che il riquadro Utilità sia aperto.

Aggiungi un nuovo oggetto trascinando un oggetto dall'elenco Oggetti nel riquadro Utilità nello spazio sopra o sotto l'oggetto Finestra. Seleziona l'oggetto. Fai clic sulla finestra di ispezione Identità nel riquadro Utilità. Cambia la classe al delegato dell'applicazione (MyAppDelegate, in questo esempio.)

Apri la finestra di ispezione delle connessioni per MyAppDelegate. Collegare l'outlet della finestra alla finestra già esistente nel file di interfaccia.

Fai clic su Proprietario del file a sinistra, quindi fai clic su Impostazioni identità nel riquadro Utilità. Cambia la classe inUIApplication

Apri la finestra di ispezione delle connessioni per il proprietario del file. Connetti la presa delegato all'oggetto MyAppDelegate.

4. Infine, e molto importante, fare clic sull'oggetto Window nel file di interfaccia. Apri la finestra di ispezione Attributi. Assicurati che "Visibile all'avvio" sia selezionato.

Questo è tutto ciò che dovevo fare per farlo funzionare per me. In bocca al lupo!


6

Se usi MTStatusBarOverlay, otterrai questo errore.

MTStatusBarOverlay crea una finestra aggiuntiva (finestre [[UIApplication sharedApplication]) che non ha un controller di root.

Questo non sembra causare problemi.


Sei sicuro di questo? L'hai provato?
Sergey Grischyov il

Sono sicuro che crea una finestra e sono sicuro che non crea problemi nelle mie app.
Confuso Vorlon,

È possibile impostare un VC fittizio su MTStatusBarOverlay per risolverlo.
Wesley,

Questo era esattamente il mio problema. Ho avuto un tipo simile di installazione con una finestra che è stata aggiunta per una barra di notifica e, una volta commentato, l'errore è scomparso! Sembra innocuo in questo caso.
Aaron Zinman,

6

Ricevuto lo stesso errore dopo aver sostituito la mia UI con uno Storyboard, usando XCode 4.6.3 e iOS 6.1

Risolto eliminando tutto il codice da didFinishLaucnhingWithOptions in AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    return YES;
}

5

OrdoDei ha dato una risposta corretta e preziosa. Sto aggiungendo questa risposta solo per dare un esempio di un didFinishLaunchingWithOptionsmetodo che utilizza la sua risposta, oltre a tenere conto dei commenti degli altri riguardanti il ​​controller di navigazione.

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];

    // Override point for customization after application launch.

    // Instantiate the main menu view controller (UITableView with menu items).
    // Pass that view controller to the nav controller as the root of the nav stack.
    // This nav stack drives our *entire* app.
    UIViewController *viewController = [[XMMainMenuTableViewController alloc] init];
    self.navigationController = [[UINavigationController alloc] initWithRootViewController:viewController];

    // Instantiate the app's window. Then get the nav controller's view into that window, and onto the screen.
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    // [self.window addSubview:self.navigationController.view];
    // The disabled line above was replaced by line below. Fixed Apple's complaint in log: Application windows are expected to have a root view controller at the end of application launch
    [self.window setRootViewController:self.navigationController];
    self.window.backgroundColor = [UIColor whiteColor];
    [self.window makeKeyAndVisible];
    return YES;
}

4

Questo è successo per me perché ho inavvertitamente commentato:

[self.window makeKeyAndVisible];

a partire dal

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

4

Sono stato in grado di impostare il controller di visualizzazione iniziale nella schermata di riepilogo di xcode.

Fai clic sul nome più in alto del progetto in Esplora file a sinistra (dovrebbe avere una piccola icona di progetto). Nella colonna centrale fai clic sul nome del tuo progetto sotto "OBIETTIVI" (dovrebbe avere una piccola icona "A" accanto ad esso). Cerca in "Informazioni sulla distribuzione di iPhone / iPod" e cerca "Interfaccia principale". Dovresti essere in grado di selezionare un'opzione dal menu a discesa.


4

Oltre alla risposta "sho", che è corretta (il quarto parametro di UIApplicationMain dovrebbe essere il nome del controller principale), aggiungo alcuni commenti.

Di recente ho modificato il "modello" di una mia app dall'utilizzo di MainWindow.xib per costruire una finestra in modo programmatico. L'app utilizzava un modello precedente che creava automaticamente quella MainWindow. Dal momento che volevo supportare un controller diverso per visualizzare XIB per iPhone 5, è più semplice scegliere il giusto XIB a livello di programmazione quando viene creato il delegato dell'app. Ho rimosso anche MainWindow.xib dal progetto.

Il problema era, ho dimenticato di riempire il quarto parametro in UIApplication main e HO DIMENTICATO DI RIMUOVERE MainWindow da "Interfaccia principale" nel Riepilogo del progetto.

Ciò ha causato un GRANDE problema: ha reso innocuo l'avviso "Le applicazioni dovrebbero ..." sui dispositivi di sviluppo, ma quando è andato su App Store, si è rotto sui telefoni di consumo, bloccandosi perché MainWindow non era più nel bundle! Ho dovuto richiedere una revisione rapida per la correzione.

Un altro sintomo è che a volte un blocco bianco, come un UIView vuoto, a volte appariva quando le impostazioni venivano modificate e l'app veniva messa in primo piano. In iPhone 5 era chiaro che si trattava di un blocco 320x480. Forse la MainWindow mancante veniva creata in modalità di sviluppo, utilizzando le dimensioni precedenti. Avevo appena trovato questo errore quando i primi rapporti sull'incidente hanno raggiunto la posta in arrivo.

L'installazione dell'app da App Store anziché da XCode ha mostrato che l'app si è effettivamente bloccata e il problema di MainWindow si è rivelato nel registro, quindi ho potuto vedere che non era una combinazione speciale di dispositivi + versioni IOS.


4

Per aggiungere alla risposta di Mike Flynn, dopo l'aggiornamento a Xcode 7 e l'esecuzione della mia app su un dispositivo iOS 9, ho aggiunto questo al mio (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

// Hide any window that isn't the main window
NSArray *windows = [[UIApplication sharedApplication] windows];
for (UIWindow *window in windows) {
    if (window != self.window) {
        window.hidden = YES;
    }
}

Sono curioso di sapere quante finestre aveva la tua app e se tutte avevano un controller di visualizzazione root. Grazie
DrAL3X il

3

Questo problema si verifica quando Interface Builder non è configurato correttamente.

Assicurati che la finestra del delegato dell'app e le prese viewController siano collegate:

In MainWindow.xib, mantieni il controllo, fai clic su Delega app e trascina l'oggetto Window. Seleziona la finestra Tieni il controllo e seleziona nuovamente il delegato dell'app, trascina sul controller della vista principale e seleziona viewController.


3

Questo errore viene visualizzato anche quando il proprietario del file MainWindow.xib non è impostato correttamente.

Il proprietario del file è UIApplication
-> oggetto inserito della classe delegata dell'app con l'outlet della finestra collegato alla finestra


Ho creato manualmente un file xib e ho iniziato a ricevere questo errore. grazie mille!
RawMean
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.