web-dev-qa-db-fra.com

Instanciation par programme d'un contrôleur de vue avec Storyboard à partir d'AppDelegate

Je suis en train de créer une application. Quand il est lancé pour la première fois, il demande à l'utilisateur de faire deux choses: 

  1. Choisissez un pays 
  2. Accepter les conditions 

De là, il va au contrôleur de vue d'accueil. 

Le problème auquel je suis actuellement confronté est de pousser le premier contrôleur de vue sur l'écran de mon délégué d'application. J'utilise des storyboards/Xcode 5/iOS7 

Voici le code que je suis venu avec:

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

Le problème est que l'application se bloque lorsqu'elle frappe la dernière ligne de code avec l'erreur suivante: 

* Arrêt de l'application en raison d'une exception non interceptée 'NSInvalidArgumentException', raison: '- [UIViewController pushViewController: animated:]: sélecteur non reconnu envoyé à l'instance 0x8e9a400 '

Quelqu'un a une idée de ce que je fais mal?

10
Robert J. Clegg

Vous vous attendez à ce que self.window.rootViewController soit une UINavigationController mais c'est une UIViewController. Cela signifie que le contrôleur de vue le plus à l'extérieur de votre scénario est d'un type incorrect.

Un meilleur moyen d’obtenir la UINavigationController (ce qui devrait fonctionner dans ce cas) consiste à utiliser la propriété self.navigationController sur toute UIViewController.

D'après ce que j'ai compris, vous voulez présenter une vue lors de la première utilisation, pour que l'utilisateur sélectionne des éléments. Ce que vous devriez alors faire est de présenter un contrôleur de vue modal, comme ceci:

- (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];
}
11
Rick

Vous devez faire deux choses:

  1. Dans Storyboard, vous avez mentionné le nom du contrôleur (par exemple, LoginView) et activé l'utilisation de l'ID de storyboard.
  2. Ensuite, vous avez utilisateur la ligne ci-dessous

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

J'espère que cela t'aides. Faites-moi savoir si vous avez toujours le problème.

7
Nattudurai
[self performSegueWithIdentifier:@"buyListSegue" sender:sender];
0
Gank

Je pense que l'identifiant du contrôleur "CountrySettings" est défini sur le mauvais contrôleur. Vous n'obtenez pas de NavigationController où vous pouvez appeler pushViewController...

0
regetskcob