web-dev-qa-db-de.com

"Es wird erwartet, dass die Anwendungsfenster am Ende des Anwendungsstarts einen Root-View-Controller haben" nur auf dem iPad

Ich versuche, nur meine iPhone-Anwendung in eine Universal-Anwendung zu konvertieren. Ich habe die Geräte auf Universal umgestellt und Xcode hat es sich zur Aufgabe gemacht, ein MainWindow-iPad.xib für mich zu erstellen. Wenn ich nun die App im iPhone-Simulator starte, funktioniert das einwandfrei, aber wenn ich es im iPad-Simulator starte, bekomme ich ein weißes Bildschirm und der Application windows are expected to have a root view controller at the end of application launch-Fehler. Ich habe einige andere Beiträge zu diesem Problem gelesen, aber keiner von ihnen ist nur auf ein Gerät beschränkt.

Hier ist meine application:didFinishLaunchWithOptions: Methode:

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

 /* some dropbox setup stuff */


// INIT VIEW AND CORE DATA
RootViewController *rootViewController = [[RootViewController alloc] initWithNibName:@"RootViewController" bundle:nil];

NSManagedObjectContext *context = [self managedObjectContext];
if (!context) {
    // Handle the error.
}

rootViewController.managedObjectContext = context;

UINavigationController *aNavigationController = [[UINavigationController alloc] initWithRootViewController:rootViewController];
self.navigationController = aNavigationController;

[_window addSubview:[_navigationController view]];
[_window makeKeyAndVisible];

[rootViewController release];
[aNavigationController release];

return YES;
}

BEARBEITEN: Ich habe nur einen Root-View-Controller mit der Bezeichnung RootViewController für iPhone. Aber es sollte trotzdem geladen werden, oder? Oder wenn nicht, wie erstelle ich eines für iPad?

19
Josh Sherick

Ändern Sie die folgende Zeile:

[_window addSubview:[_navigationController view]];

zu:

_window.rootViewController = _navigationController;

oder, wenn Sie iOS 3-Kompatibilität benötigen:

if ([_window respondsToSelector:@selector(setRootViewController:)]) {
    _window.rootViewController = _navigationController;
} else {
    [_window addSubview:_navigationController.view];
}
52
hoshi

Sie müssen einen RootViewController mit der Xib-Datei für das iPad erstellen. Andernfalls wird diese Fehlermeldung angezeigt. Nachfolgend finden Sie den von Xcode für die Universal-App bereitgestellten Vorlagencode. Wenn Sie die App im iPad-Simulator debuggen und den Debugger dazu veranlassen, den View-Controller mit der iPhone-Xib-Datei zu erstellen, wird der genaue Fehler angezeigt.

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    // Override point for customization after application launch.
    if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) {
        self.viewController = [[SYKViewController alloc] initWithNibName:@"SYKViewController_iPhone" bundle:nil];
    } else {
        self.viewController = [[SYKViewController alloc] initWithNibName:@"SYKViewController_iPad" bundle:nil];
    }
    self.window.rootViewController = self.viewController;
    [self.window makeKeyAndVisible];
    return YES;
}
2
Ken W

In iOS 4 und höher verfügt UIWindow über die einstellbare Eigenschaft rootViewController. Dies ist die UINavigationController, die die beim Starten der Anwendung angezeigte UIViewController auslöst. Wählen Sie in Xcode IB Initial Scene: Ist der Start-View-Controller für UINavigationController wird alles ohne Code eingestellt.

2
paul.lander

Fügen Sie im generierten MainWindow-iPad.xib im Interface Builder ein View Controller-Objekt in IB sowie ein Objekt unter der Ansicht hinzu. Legen Sie für das Objekt seine Klasse auf AppDelegate fest, für den View Controller die Klasse auf ViewController (Identity Inspector) und geben Sie den Namen der Spitze im Attribut Inspector an. Sie können die MainWindow.nib für das Gerät anzeigen, von dem aus Sie konvertieren, um die Unterschiede zu sehen.

Edit: Ich habe einige wichtige Schritte vergessen. Sie müssen außerdem die Eignerklasse der Datei in IB auf "UIApplication" setzen und die Referenzierungsauslässe entsprechend für den App-Delegaten- und View-Controller einstellen. Auch in IB ist es am einfachsten, den Connections Inspector für die MainWindow-Spitze, die Sie hatten, anzusehen und zu emulieren. Wenn Sie über eine andere für das iPad spezifische Spitze als MainWindow-iPad.nib verfügen (d. H. ViewController-iPad.nib), wählen Sie unbedingt den Besitzer der Datei aus, zeigen Sie auf die Ansicht, und legen Sie die Klasse entsprechend fest.

2
Ed Lau

Ich habe Ihre Vorschläge ausprobiert, aber keiner von ihnen hat für mich gearbeitet, sorry. :/Ich habe nur die Ansicht manuell in Code ohne Interface Builder erstellt:

if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) {
    // Setup view for iPad
} else
    // Setup view for iPhone and iPod Touch
}

was ich dachte, wäre viel schwieriger als es tatsächlich war.

Wenn Sie diese Methode verwenden, können Sie immer noch alles im Interface Builder anschließen und einfach den Rahmen der Objekte in diesen Blöcken ändern, wenn Sie sowohl auf dem iPhone als auch auf dem iPad die gleichen Objekte haben.

0
Josh Sherick