2013-12-12 5 views
10

Ich bin beschäftigt eine App bauen -, dass, wenn zum ersten Mal fragt es den Benutzer gestartet, zwei Dinge zu tun:einen View-Controller programmatisch mit Storyboard von AppDelegate Instanziierungsanwendung

  1. Wählen Sie ein Land
  2. Accept T & Cs

Von dort geht es zum Home View Controller.

Das Problem, mit dem ich derzeit konfrontiert bin, ist das Drücken des ersten View-Controllers von meinem App-Delegaten auf den Bildschirm. Ich bin mit Storyboards/Xcode 5/iOS7

Hier ist der Code, kam ich mit:

UINavigationController *navigationController = (UINavigationController *)self.window.rootViewController; 
UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"Main_iPhone" bundle: nil]; 
BBCounterySettingsViewController *controller = (BBCounterySettingsViewController*)[mainStoryboard instantiateViewControllerWithIdentifier: @"CountrySettings"]; 
[navigationController pushViewController:controller animated:NO]; 

Das Problem der Abstürze App ist, wenn es die letzte Zeile Code mit dem folgenden Fehler hits:

* Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UIViewController pushViewController:animated:]: unrecognized selector sent to instance 0x8e9a400'

Wer hat irgendwelche Ideen, was ich falsch mache?

Antwort

11

Sie erwarten, dass die self.window.rootViewController eine UINavigationController ist, aber es ist eine UIViewController. Dies bedeutet, dass der äußerste View-Controller in Ihrem Storyboard vom falschen Typ ist.

Eine bessere Möglichkeit, die UINavigationController (die in diesem Fall funktionieren sollte) zu erhalten, ist die Eigenschaft self.navigationController auf einer UIViewController zu verwenden.

Von dem, was ich verstehe, möchten Sie eine Ansicht präsentieren das erste Mal, dass der Benutzer läuft, um den Benutzer einige Sachen zu holen. Was sollten Sie dann tun vorhanden ist, eine modale View-Controller, wie folgt aus:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 
//isFirstRun is some boolean you use to determine if it's the first run 
if(isFirstRun){ 
    BBCounterySettingsViewController *controller = (BBCounterySettingsViewController *)[mainStoryboard instantiateViewControllerWithIdentifier: @"CountrySettings"]; 
    [self.window.rootViewController presentViewController: controller animated:YES completion:nil]; 
} 
+0

Ich glaube, ich gehe diesen Ansatz falsch an. Dieser View-Controller muss nirgendwo anders navigieren. Muss nur entlassen werden. Der Rest der App ist eine Tab-basierte App. In der App Delegate self.navigationController existiert nicht? – Tander

+0

Ich werde meine Antwort mit einem neuen Tipp dann aktualisieren :) – Rick

7

Es gibt zwei Dinge, die Sie tun müssen, um:

  1. in der Storyboard Sie den Controller Namen genannt haben (zB Loginview) und die Verwendung Storyboard ID
  2. Dann können Sie Benutzer, die unterhalb der Linie

    haben
    loginView = [storyboard instantiateViewControllerWithIdentifier:@"LoginView"]; 
    [(UINavigationController*)self.window.rootViewController pushViewController:loginView animated:NO]; 
    

Hoffe, das hilft. Lassen Sie mich wissen, ob Sie das Problem immer noch haben.

+0

Dank dies auch geholfen. – Tander

+0

Wenn Sie Ihren ViewController in einen UINavigationController einbetten, können Sie auch die 'instanziateInitialViewController()' Methode thom 'UIStoryBoard' verwenden. Dies lädt automatisch den ViewController, der mit einem Pfeil in Ihrem Storyboard markiert ist. Wenn dieser ViewController ein Container ist, werden auch seine untergeordneten Objekte geladen. – Vinzzz

0
[self performSegueWithIdentifier:@"buyListSegue" sender:sender]; 
+1

Diese Antwort könnte mit einigen Erklärungen ... –

+0

nicht hilfreich. Segues kann nicht aus dem AppDelegate oder ViewControllers kein Teil eines UINavigationController – Tander

0

Ich denke, die Steuerungsidentifizierer "CountrySettings" an die falsche Steuerung eingestellt wird. Sie erhalten keine NavigationController, wo Sie anrufen können ...

+0

Gelöst das Problem, danke. Markierte Antwort war das Problem. – Tander

Verwandte Themen