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

383

In meiner Konsole wird der folgende Fehler angezeigt:

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

Unten ist meine application:didFinishLaunchWithOptionsMethode:

- (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 ist der UITabBarControllerDelegat des Benutzers mit dem App-Delegaten verbunden.

Weiß jemand, wie man dieses Problem behebt?

ArtSabintsev
quelle
5
Führen Sie unmittelbar vor der Zuweisung ein NSLog von self.tabBarController durch. Die Nachricht wird nur ausgelöst, wenn der Controller Null ist. Wenn es Null ist und Sie sichergestellt haben, dass Ihre Verbindungen korrekt sind, versuchen Sie, den Controller im Code zu instanziieren.
FeifanZ
Versuchen Sie, die Initialisierung des Fensters zu kommentieren. Überprüfen Sie diese Antwort. stackoverflow.com/a/33958144/1293445
mohammad alabid

Antworten:

188

Ich hatte das gleiche Problem. Überprüfen Sie Ihre Hauptleitung. Das letzte Argument sollte auf den Namen der Klasse gesetzt werden, die das UIApplicationDelegate-Protokoll implementiert.

retVal = UIApplicationMain(argc, argv, nil, @"AppDelegate");
sho
quelle
49
Eine weitere Option besteht darin, sicherzustellen, dass die App-Delegatenklasse in main importiert und verwendet wird NSStringFromClass. So erstellt Xcode jetzt die Datei main.m. Zum Beispiel: #import "AppDelegate.hund dannint retVal = UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
sho
10
Stellen Sie sicher, dass self.windowes wie folgt initialisiert istself.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
Raptor
1
Ich habe die oben genannten Optionen ausprobiert und bei mir nicht funktioniert. Und ich benutze kein Storyboard.
Jowie
3
Hatte keine Auswirkung für mich, die gleiche Meldung "Anwendungen werden erwartet ..." nach der Änderung. Die Lösung war OrdoDeis Antwort (siehe oben oder unten), die perfekt funktionierte.
Andrew
1
Wenn Sie im Simulator eine weiße Ansicht sehen, aber das Layout von einem Storyboard aus sehen sollen, stellen Sie sicher, dass Sie den Code in Ihrer Root-Delegatfunktion "application didFinishLaunchingWithOptions ..." entfernt haben, auf den in main.m verwiesen wird, und nur "return" haben JA;" drin.
Olivier de Jonge
435

In AppDelegate ersetzen

 [window addSubview:[someController view]];

zu

  [self.window setRootViewController:someController];
OrdoDei
quelle
Dies hat die Nachricht für mich beseitigt. Es wird immer noch kein nachfolgendes Fenster angezeigt, aber das kann ein anderes Problem sein. Vielen Dank.
Jazzmine
3
Wenn Sie einen UINavigationController verwenden, sollten Sie zuerst [[UINavigationController] initWithRootViewController: tableViewController] und dann den Code über [self.window setRootViewController: self.navigationController] verwenden, um den Root-View-Controller des Fensters
emdog4
Cocos2d hat einen Kommentar, der besagt "// AddSubView funktioniert nicht unter iOS6". Dies hat es für mich behoben, da ich iOS 6 verwende.
Almo
1
Die addSubviewZeile war Teil der Projektvorlage einer frühen Version von Xcode / iOS SDK. Wenn die App einen langen Weg zurücklegt, haben Sie sie möglicherweise auch dann, wenn Sie sie nicht geschrieben haben.
Seva Alekseyev
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
70

Ich hatte den gleichen Fehler beim Versuch, den ersten geladenen View Controller zu ändern

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

Zuerst wusste ich nicht genau, woher der Fehler kam, also habe ich ihn eingegrenzt und herausgefunden, was schief gelaufen ist. Es stellt sich heraus, dass ich versucht habe, die Anzeige einer Ansicht zu ändern, bevor sie tatsächlich auf dem Bildschirm angezeigt wurde. Die Lösung bestand daher darin, diesen Code in den Viewcontroller zu verschieben, von dem ich Probleme hatte

- (void)viewDidLoad

zu

- (void)viewDidAppear:(BOOL)animated

und der Fehler wurde nicht mehr angezeigt. Mein Problem wurde speziell durch eine UIAlertViewShow verursacht.

In Ihrem Fall schlage ich vor, dass Sie den Code im aktiven Ansichts-Controller des tabBarController auschecken (da dies wahrscheinlich ein Problem in diesem Ansichts-Controller ist). Wenn dies nicht funktioniert, versuchen Sie, die Starteinstellungen in der NIB-Datei anstatt im Code festzulegen. Wenn Sie dies im Code tun möchten, verschieben Sie den Code in die entsprechende Methode des aktiven Viewcontrollers von tabBarController.

Viel Glück!

Warkst
quelle
1
Warkst, danke für die Antwort. In meinem Fall kann ich den Code nicht verschieben viewDidLoad:(ohne ein Flag hinzuzufügen), und ich sollte dies auch nicht tun müssen. Trotzdem danke für den Vorschlag!
ArtSabintsev
2
Ich habe das heute gefunden und bin froh, dass ich - dasselbe Problem - einem Uialert einen Start in viewDidLoad gezeigt habe. In viewDidAppear geändert und funktioniert einwandfrei. Ich bin mir nicht sicher, was Apple mehr bringt, wenn es dies in iOS5 ändert.
GuybrushThreepwood
Vielen Dank für den Vorschlag, dass die Alarmansicht dies verursacht hat. Das gleiche Problem ist mir auch passiert.
Chris
1
Können Sie uns sagen, welchen Code Sie entfernen mussten, um ihn zu sortieren? Ich benutze meine viewDidLoadfür viele Dinge und richte alle erstmaligen Dinge ein, wie zum Beispiel das Hinzufügen von Daten zum UITableView. Ich kann es nicht verschieben, viewDidAppear:weil ich möchte, dass es nur einmal ausgelöst wird.
Jowie
1
Das Problem war nicht die falsche Funktion. Das Problem war, dass Sie vergessen haben, [super viewDidLoad] in Ihrer viewDidLoad-Funktion aufzurufen, wodurch die Federlast effektiv beendet wurde. Das gleiche ist mir mehr als einmal passiert.
Borrrden
47

Ich habe dies erhalten, als ich mit der Vorlage "Leere Anwendung" begonnen und dann manuell eine XIB hinzugefügt habe. Ich habe es gelöst, indem ich den Hauptnamen der Feder festgelegt habe, wie von Sunny vorgeschlagen. Der fehlende Schritt in diesem Szenario ist das Entfernen

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

von

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

Da wird die in der Xib-Datei erstellte Instanz Ihres Fensters überschrieben. Dies setzt voraus, dass Sie einen ViewController erstellt und ihn mit Ihrem Fenster und App Delegate in der XIB-Datei verbunden haben.

jlujan
quelle
Das hat es auch für mich behoben. Ich habe eine Tabbed-Anwendung mit einem Storyboard verwendet, zu dem ich CoreData hinzufügen wollte, und bin auf dieses Problem gestoßen.
Gitaarik
lol Wenn ich dies hinzufüge, erhalte ich zwei Warnungen, dass Anwendungsfenster voraussichtlich einen Root-View-Controller haben !!
George Asda
46

Das ist mir passiert. Gelöst durch Bearbeiten der .plist-Datei. Geben Sie den Basisnamen der Haupt-NIB-Datei an (sollte MainWindow.xib sein). Hoffe das wird helfen.

Geben Sie hier die Bildbeschreibung ein

sonnig
quelle
2
Das hat bei mir funktioniert! Dies funktioniert, wenn Sie in Xcode 4.2 ein leeres Projekt erstellen, in dem kein MainWindow vorhanden ist, und so müssen wir es anschließen.
Jeevangs
Das Problem trat für uns auf, als wir versehentlich die Zeile 'Main nib file base name' aus der 'Info.plist'-Datei löschten. Durch erneutes Einfügen dieser Zeile wurde das Problem behoben.
RTOVAR
Sie können dies auch in den Projekteigenschaften festlegen. Wählen Sie das Projekt und Ihr Ziel aus. Sie können dies unter Zusammenfassung -> Informationen zur iPhone / iPad-Bereitstellung bearbeiten.
Doekman
Dies war eigentlich das Problem für mich und führte zu mehreren Problemen beim zweimaligen Aufrufen von viewDidLoad und viewWillAppear auf dem rootViewController. In meinem Fall war dies die Lösung
Whyoz
27

Ich habe kürzlich das gleiche Problem beim Erstellen eines Projekts mit ios5 sdk. Zuerst wurde es richtig gebaut und lief, aber danach trat der Fehler auf.
In meinem Fall war die Lösung ziemlich einfach.
Was fehlte, war, dass irgendwie die Eigenschaft Hauptschnittstelle auf der Registerkarte Zusammenfassung meines Anwendungsziels gelöscht wurde. Also musste ich es erneut einstellen.


Wenn dies nicht der Punkt ist und der tabBarController immer noch Null ist, können Sie Ihr Fenster und Ihren Root-Controller jederzeit programmgesteuert erstellen. Als Fallback habe ich meinem Projekt den folgenden Code hinzugefügt

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

Dies funktioniert nur, wenn die Lösung von sho ebenfalls implementiert ist.

Denicija
quelle
24

Ich habe ein Upgrade auf iOS9 durchgeführt und diesen Fehler aus dem Nichts behoben. Ich konnte es beheben, aber den folgenden Code hinzufügen- (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;
    }
}
Mike Flynn
quelle
Ich bin gespannt, wie viele Fenster Ihre App hatte und ob alle einen Root View Controller hatten. Vielen Dank
DrAL3X
5
HINWEIS : Diese Antwort ist eine Problemumgehung und behebt die Grundursache nicht. Siehe stackoverflow.com/a/33958144/1116061
lipka
Du bist ein wahrer Held!
user2161301
21

Keiner der oben genannten Vorschläge löste mein Problem. Meins war das:

Hinzufügen:

window.rootViewController = navigationController;

nach:

[window addSubview:navigationController.view];

in meinem Appdelegate

- (void)applicationDidFinishLaunching:(UIApplication *)application {
RyeMAC3
quelle
20
  • Wählen Sie Ihr "Fenster" in Ihrer Nib-Datei
  • Aktivieren Sie im "Attributes Inspector" die Option "Beim Start sichtbar".

Bild![]

  • Dies geschieht, wenn Ihre NIB-Datei manuell erstellt wird.
  • Dieser Fix funktioniert im regulären Nib-Modus - nicht im Storyboard-Modus
bearMountain
quelle
Dies ist meiner Meinung nach nur im Storyboard-Modus zu finden.
ArtSabintsev
Nein, dieses Projekt war der reguläre Federmodus. Dies ist ein Screenshot aus dem Storyboard-Modus. "Beim Start sichtbar" vs. "Ist Initial View Controller".
BearMountain
3
Wenn die manuell erstellte Fensternib-Datei und "Beim Start sichtbar" standardmäßig deaktiviert ist, wird diese Meldung nach dem Start der App angezeigt. Dies behebt mein Problem!
ZYiOS
OH DANKE!!! Endlich eine Lösung für diese nervige Warnung. Selbst wenn Sie es haben makeKeyAndVisible, wird das Problem nicht behoben. NUR dadurch wurde die Warnung für mich gelöst. VIELEN DANK!
Tacos_tacos_tacos
"Dies geschieht im regulären Federmodus - nicht im Storyboard-Modus" Nicht sehr wahr. Ich bin vor dem gleichen Problem mit Storyboardauch
thesummersign
19

So fügen Sie einen RootViewController für iOS5 hinzu

Wenn Ihre App bisher keinen RootViewController verwendet hat, erstellen Sie einfach einen;), indem Sie auf Datei> Neu> Neue Datei klicken. Wählen Sie UIViewController subclass Name es RootViewController , deaktivieren Sie das mit XIB für Benutzeroberfläche (vorausgesetzt , Sie bereits eine haben) und setzen diesen Code in Ihre AppDelegate :: didFinishLaunchingWithOptions

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

sicher - Sie müssen RootViewController.h importieren und die Variable erstellen

Hier ist ein schöner Artikel über den RootViewController und das AppDelegate.

rémy
quelle
Der Artikel-Link zu cupsofcocoa.com ist tot - eine Idee, ob es irgendwo eine Kopie gibt?
Ríomhaire
1
Dies ist zu binpress.com verschoben, aktualisiert den Link in der Antwort
rémy
Das ist eine großartige Verbindung. Gut gelesen und erklärt, was passiert. Ich bin gerade auf dieses Problem gestoßen, als ich ein altes Buch verwendet habe (da ich zuerst Objective-C lernen möchte), aber Code auf dem neuesten XCode 7 geschrieben habe, der nicht über die älteren Vorlagen verfügt.
Ibaralf
11

Ich hatte auch diesen Fehler, aber im Gegensatz zu den zuvor aufgeführten Antworten war meine, weil ich die Methode 'loadView' in meinem neu generierten Controller (xcode 4.2, ios5) auskommentiert hatte.

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

Es sagte mir sogar, dass die Methode zum programmgesteuerten Erstellen der Ansicht gedacht war, aber ich habe sie verpasst, weil sie anderen Methoden wie viewDidLoad so ähnlich sah, dass ich sie normalerweise verwende und sie nicht abfange.

Um dies zu lösen, entfernen Sie einfach diese Methode, wenn Sie die Ansichtshierarchie nicht programmgesteuert mit Feder oder Storyboard erstellen.

trcarden
quelle
Ich kann bestätigen, dass dies das Problem verursachen kann. Ich hatte die gleiche Situation, als ich dem Tutorial über TableView folgte, in dem die Delegaten in loadView festgelegt wurden. Nachdem dieser Code in viewDidLoad verschoben und die loadView entfernt wurde, funktionierte alles nach Bedarf.
Eugen
Sie können weiterhin die Ladeansicht verwenden, aber [super loadView] hinzufügen. am Anfang.
Hermann Klecker
1
Hmm ... in der Dokumentation zu loadView heißt es ausdrücklich, dass Sie die Super-Methode nicht aufrufen sollten.
Joshua Sullivan
Ich habe den Standard-UIViewController in einem Storyboard überschrieben und festgestellt, dass für den Vorlagencode zum Erstellen einer UIViewController-Unterklasse loadView standardmäßig aktiviert ist, was dies für mich verursacht hat ... über eine Stunde mit dieser dummen Sache verschwendet. Danke, dass du das gepostet hast!
Slycrel
11

Ich habe auch diese Probleme. Ich habe mein Projekt in xcode4.2.1 ausgeführt. Ich habe dort oben alle Kommentare gelesen, aber niemand ist cool für mich. Nach einer Weile stelle ich fest, dass ich einen Code kommentiert habe.

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

dann habe ich es auskommentiert. Für mich ist alles in Ordnung. Ich hoffe, das wäre hilfreich für euch.

Bruce Lee
quelle
Der Code: "self.window = [[UIWindow alloc] initWithFrame: [[UIScreen mainScreen] bounds]];" einen Fehler verursachen, also habe ich ihn gerade gelöscht.
Grigori A.
11

Stellen Sie sicher, dass Sie diese Funktion in Ihrem Anwendungsdelegierten haben.

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

Stellen Sie sicher, dass didFinishLaunchingWithOptions YES zurückgibt. Wenn Sie die Zeile 'return YES' entfernt haben, wird der Fehler verursacht. Dieser Fehler kann besonders häufig bei Storyboard-Benutzern auftreten.

Antizyklop
quelle
viel Lob, das ist was ich wollte (leeres Projekt mit Storyboard)
Shtirlic
2
Hier gilt das gleiche. Vielen Dank. Wenn Sie eine leere Anwendung erstellen, wird diese Methode mit der manuellen Erstellung des Fensters gefüllt. Dies sollte geändert werden, um einfach JA zurückzugeben. Thx
Ben G
10

Mit meiner ersten Ansicht MenuViewControllerfügte ich hinzu:

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

zur App Delegate-Methode:

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

Das hat funktioniert.

Cujino
quelle
10

In iOS 5.0 gab es eine geringfügige Änderung, die einen Root-View-Controller erforderlich machte. Wenn Ihr Code auf älterem Beispielcode wie GLES2Sample basiert , wurde in diesen Codebeispielen kein Root-View-Controller erstellt.

Um dies zu beheben (z. B. dieses GLES2Sample), applicationDidFinishLaunchingerstelle ich direkt in einen Root-View-Controller und hänge mein glView daran an.

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

Dadurch verschwindet die Warnung und Ihre App wirkt sich sonst nicht wirklich aus.

Bobobobo
quelle
9

Versuchen Sie, das IBOutlet des Registerkartenleisten-Controllers mit der Stammansicht im Interface Builder zu verbinden

self.window.rootViewController = self.tabBarController;

Aber eigentlich habe ich einen solchen Fehler noch nie gesehen.

d.lebedev
quelle
8

Ich habe das Problem folgendermaßen gelöst (keine der anderen oben genannten Lösungen hat geholfen):

Wählen Sie im Pulldown-Menü für "Hauptschnittstelle" einen anderen Eintrag aus, wählen Sie "Hauptfenster" erneut aus und erstellen Sie ihn neu.

Geben Sie hier die Bildbeschreibung ein

RawMean
quelle
8

Ich bin auf dasselbe Problem gestoßen, aber ich habe es verwendet storyboard

Zuweisen meiner storyboard InitialViewControllerzu meinen Fenstern rootViewController.

Im

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

und das löste das Problem.

das Sommerzeichen
quelle
7

Ich hatte das gleiche Problem direkt nach dem Upgrade auf Xcode 4.3 und nur, wenn ich ein Projekt von Grund auf neu startete (dh ein leeres Projekt erstellen, dann einen UIViewController erstellen und dann eine separate Nib-Datei erstellen).

Nachdem ich ALLE Zeilen eingefügt hatte, die ich früher verwendet hatte, und sichergestellt hatte, dass ich die richtigen Verbindungen hatte, wurde dieser Fehler immer wieder angezeigt, und die NIB-Datei, die ich über den View-Controller (der als rootController festgelegt war) laden wollte, wurde im Simulator nie angezeigt.

Ich habe eine einzelne Ansichtsvorlage über Xcode erstellt und mit meinem Code verglichen und ENDLICH das Problem gefunden!

Xcode 4.3 scheint standardmäßig die Methode - (void) loadView hinzuzufügen; zum Abschnitt zur Implementierung des View Controllers. Nach sorgfältigem Lesen der darin enthaltenen Kommentare wurde klar, wo das Problem lag. Der Kommentar wurde angegeben, um die loadView-Methode zu überschreiben, wenn eine Ansicht programmgesteuert erstellt wird (und ich paraphrasiere), andernfalls, um loadView NICHT zu überschreiben, wenn eine Schreibfeder verwendet wird. Es gab nichts anderes in dieser Methode, also habe ich im Affekt die Methode überschrieben (und nichts getan), während ich eine NIB-Datei verwendet habe, die den Fehler verursacht hat.

Die LÖSUNG bestand darin, entweder die loadView-Methode vollständig aus dem Implementierungsabschnitt zu entfernen oder die übergeordnete Methode durch Hinzufügen von [super loadView] aufzurufen.

Das Entfernen ist am besten, wenn die Verwendung einer NIB-Datei als Hinzufügen eines anderen Codes diese tatsächlich überschreibt.

Raz
quelle
das war genau mein problem! Ich hatte eine loadView-Implementierung hinzugefügt, aber nicht super aufgerufen. Ich habe einige andere Codeänderungen vorgenommen und konnte mich nicht erinnern, was zum Teufel ich getan habe. Habe mich 2 Stunden lang festgefahren, weil diese Veränderung so harmlos schien.
LearnCocos2D
6

Ich hatte die gleiche Fehlermeldung im Protokoll. Ich hatte ein UIAlertView-Popup in der Anwendung: didFinishLaunchingWithOptions. Ich habe es gelöst, indem ich den Aufruf von alertView verzögert habe, damit der Root-View-Controller Zeit zum Beenden des Ladevorgangs hat.

In der Anwendung: didFinishLaunchingWithOptions:

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

welches nach 1 Sekunde anruft:

- (void)callPopUp
{
    // call UIAlertView
}
janeway
quelle
Danke, das hat mein Problem gelöst. Sie müssen warten, bis die Warnung angezeigt wird, bis das Fenster geladen wurde. In meinem Fall habe ich gerade [alert performSelector: @selector (show) withObject: nil afterDelay: 1.0];
Deepwinter
6

Ich hatte das gleiche Problem. Wenn Sie wie ich eine fensterbasierte Anwendung "von Grund auf neu" erstellen, müssen Sie Folgendes tun: (Beachten Sie, dass dies Schritte für Xcode 4.2 sind.)

0. Stellen Sie sicher, dass Ihr Anwendungsdelegierter dem UIApplicationDelegate-Protokoll entspricht.

Angenommen, unser Delegat heißt MyAppDelegate. In MyAppDelegate.h sollten wir ungefähr so ​​etwas haben:

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

1. Geben Sie den Anwendungsdelegierten in main.m an

Zum Beispiel,

#import "MyAppDelegate.h"

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

2. Erstellen Sie eine Hauptfenster-Schnittstellendatei.

Klicken Sie dazu mit der rechten Maustaste auf Ihr Projekt und wählen Sie Neue Datei. Wählen Sie dort im Abschnitt iOS -> Benutzeroberfläche Fenster.

Wechseln Sie nach dem Hinzufügen der Datei zu Ihrem Projekt zur Projektzusammenfassung (klicken Sie mit der linken Maustaste auf das Projekt; klicken Sie auf Zusammenfassung). Wählen Sie unter iPhone / iPod-Bereitstellungsinformationen (und dem entsprechenden iPad-Abschnitt, falls Sie möchten) Ihre neue Schnittstellendatei unter " Kombinationsfeld "Hauptschnittstelle".

3. Schließen Sie alles im Schnittstelleneditor an

Wählen Sie Ihre Schnittstellendatei in der Dateiliste aus, um den Schnittstelleneditor aufzurufen.

Stellen Sie sicher, dass der Bereich Dienstprogramme geöffnet ist.

Fügen Sie ein neues Objekt hinzu, indem Sie ein Objekt aus der Liste "Objekte" im Bereich "Dienstprogramme" in den Bereich über oder unter Ihrem Fensterobjekt ziehen. Wählen Sie das Objekt aus. Klicken Sie im Bereich Dienstprogramme auf den Identitätsinspektor. Ändern Sie die Klasse in den Delegaten der Anwendung (in diesem Beispiel MyAppDelegate).

Rufen Sie den Verbindungsinspektor für MyAppDelegate auf. Verbinden Sie den Fensterausgang mit dem Fenster, das bereits in der Schnittstellendatei vorhanden ist.

Klicken Sie links auf den Eigentümer der Datei und dann im Bereich Dienstprogramme auf den Identitätsinspektor. Ändern Sie die Klasse inUIApplication

Rufen Sie den Verbindungsinspektor für File's Owner auf. Verbinden Sie den Delegatenausgang mit dem MyAppDelegate-Objekt.

4. Klicken Sie abschließend und vor allem auf das Fensterobjekt in der Schnittstellendatei. Öffnen Sie den Attributinspektor. Stellen Sie sicher, dass "Beim Start sichtbar" aktiviert ist.

Das war alles, was ich tun musste, damit es für mich funktioniert. Viel Glück!

Tom
quelle
6

Wenn Sie MTStatusBarOverlay verwenden, wird dieser Fehler angezeigt.

MTStatusBarOverlay erstellt ein zusätzliches Fenster ([[UIApplication sharedApplication] -Fenster), das keinen Root-Controller hat.

Dies scheint kein Problem zu verursachen.

Verwirrter Vorlon
quelle
Bist du dir da sicher? Hast du es getestet?
Sergey Grischyov
Ich bin sicher, dass es ein Fenster erstellt und ich bin sicher, dass es in meinen Apps kein Problem verursacht.
Verwirrter Vorlon
Sie können eine Dummy-VC auf das MTStatusBarOverlay setzen, um dies zu beheben.
Wesley
Das war genau mein Problem. Ich hatte eine ähnliche Art von Setup mit einem Fenster, das für eine Benachrichtigungsleiste hinzugefügt wurde, und als ich das kommentierte, verschwand der Fehler! In diesem Fall scheint es harmlos zu sein.
Aaron Zinman
6

Ich habe den gleichen Fehler erhalten, nachdem ich meine Benutzeroberfläche durch ein Storyboard mit XCode 4.6.3 und iOS 6.1 ersetzt habe

Es wurde behoben, indem der gesamte Code aus didFinishLaucnhingWithOptions im AppDelegate gelöscht wurde

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    return YES;
}
Pétur Ingi Egilsson
quelle
5

OrdoDei gab eine korrekte und wertvolle Antwort. Ich füge diese Antwort nur hinzu, um ein Beispiel für eine didFinishLaunchingWithOptionsMethode zu geben , die seine Antwort verwendet und die Kommentare der anderen zu Navigation Controller berücksichtigt.

- (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;
}
Basil Bourque
quelle
4

Dies geschah für mich, weil ich versehentlich auskommentierte:

[self.window makeKeyAndVisible];

von

- (BOOL)application:(UIApplication*) didFinishLaunchingWithOptions:(NSDictionary*)
Nicerobot
quelle
4

Ich konnte den Controller für die anfängliche Ansicht auf dem Zusammenfassungsbildschirm von xcode einstellen.

Klicken Sie im linken Datei-Explorer auf den obersten Projektnamen (er sollte ein kleines Blaupausen-Symbol haben). Klicken Sie in der mittleren Spalte unter "ZIELE" auf Ihren Projektnamen (daneben sollte ein kleines Bleistiftsymbol "A" angezeigt werden). Suchen Sie unter "iPhone / iPod-Bereitstellungsinformationen" nach "Hauptschnittstelle". Sie sollten in der Lage sein, eine Option aus der Dropdown-Liste auszuwählen.

RachelD
quelle
4

Zusätzlich zu der Antwort "sho", die korrekt ist (der vierte Parameter von UIApplicationMain sollte der Name des Hauptcontrollers sein), füge ich einige Kommentare hinzu.

Ich habe kürzlich das 'Modell' einer meiner Apps von der Verwendung von MainWindow.xib geändert, um ein Fenster programmgesteuert zu erstellen. Die App verwendete eine ältere Vorlage, die das MainWindow automatisch erstellte. Da ich eine andere Controller-Ansicht XIB für iPhone 5 unterstützen wollte, ist es einfacher, die richtige XIB programmgesteuert auszuwählen, wenn der App-Delegat erstellt wird. Ich habe auch MainWindow.xib aus dem Projekt entfernt.

Das Problem war, ich habe vergessen, den vierten Parameter in UIApplication main zu füllen, und ich habe vergessen, MainWindow von "Main Interface" in der Projektzusammenfassung zu entfernen.

Dies verursachte ein GROSSES Problem: Es gab die harmlose Warnung "Anwendungen werden erwartet ..." auf Entwicklungsgeräten wieder, aber als es in den App Store ging, brach es auf Consumer-Telefonen zusammen und stürzte ab, weil MainWindow nicht mehr im Bundle enthalten war! Ich musste eine beschleunigte Überprüfung für den Bugfix anfordern.

Ein weiteres Symptom ist, dass manchmal ein weißer Block wie eine leere UIView angezeigt wurde, wenn Einstellungen geändert und die App in den Vordergrund gestellt wurden. In iPhone 5 war klar, dass es sich um einen 320x480-Block handelte. Möglicherweise wurde das fehlende MainWindow im Entwicklungsmodus mit der alten Größe erstellt. Ich hatte diesen Fehler gerade gefunden, als die ersten Berichte über den Absturz den Posteingang erreichten.

Die Installation der App aus dem App Store anstelle von XCode hat gezeigt, dass die App tatsächlich abgestürzt ist, und das MainWindow-Problem wurde im Protokoll angezeigt, sodass ich feststellen konnte, dass es sich nicht um eine spezielle Kombination von Geräten + IOS-Versionen handelte.

epx
quelle
4

Um die Antwort von Mike Flynn zu ergänzen, habe ich dies seit dem Upgrade auf Xcode 7 und dem Ausführen meiner App auf einem iOS 9-Gerät zu meinem hinzugefügt (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;
    }
}
Kevin_TA
quelle
Ich bin gespannt, wie viele Fenster Ihre App hatte und ob alle einen Root View Controller hatten. Vielen Dank
DrAL3X
3

Dieses Problem tritt auf, wenn Sie den Interface Builder nicht richtig eingerichtet haben.

Stellen Sie sicher, dass das Fenster und die ViewController-Outlets Ihres App-Delegierten verbunden sind:

Halten Sie in Ihrer MainWindow.xib die Steuerung gedrückt, klicken Sie auf App Delegate und ziehen Sie sie auf das Window-Objekt. Fenster auswählen. Halten Sie die Kontrolle und wählen Sie den App-Delegaten erneut aus, ziehen Sie ihn auf Ihren Root-View-Controller und wählen Sie viewController aus.

Uranazo
quelle
3

Dieser Fehler wird auch angezeigt, wenn der Dateibesitzer von MainWindow.xib falsch eingestellt ist.

Der Eigentümer der Datei ist UIApplication
-> eingefügtes Objekt der App-Delegatenklasse mit dem mit dem Fenster verbundenen Fensterausgang

JakubKnejzlik
quelle
Ich habe manuell eine xib-Datei erstellt und diesen Fehler erhalten. Vielen Dank!
RawMean