web-dev-qa-db-fra.com

Autres moyens de pousser les contrôleurs de vue avec le storyboard par programme

Je recherche des moyens alternatifs de pousser les contrôleurs de vue instanciés sur le storyboard par programmation. J'ai en fait trouvé deux façons, que j'utilise pour passer à la vue suivante, mais aussi pour revenir à la précédente:

  1. en utilisant pushViewController:

    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle: nil]; 
    LocationWebView *lvc = [storyboard instantiateViewControllerWithIdentifier:@"LocationWebView"];
    [self.navigationController pushViewController:lvc animated:YES];
    
  2. effectuer Segue par programme:

    [self performSegueWithIdentifier: @"SongSegue" sender: self];
    

Avez-vous des indices sur les alternatives et sur la meilleure façon d'effectuer cette opération? Notez que je ne fais pas référence aux vues modales.

57
yassassin

Apple recommande d'utiliser performSegueWithIdentifier:sender:someObject pour effectuer des séquences par programmation. Il y a au moins quelques avantages à procéder de cette façon:

  • Moins de votre propre code signifie que vous laissez le framework faire plus de travail. Si Apple propose un nouvel effet visuel super cool pour les séquences Push, ou améliore les performances, ou corrige un bogue dans une future version iOS, votre application peut l'obtenir gratuitement. Et chaque ligne de code que vous écrivez pour faire le travail que le framework pourrait faire pour vous augmente vos chances d'écrire des bogues.

  • Plus dans IB peut signifier plus facile à changer. Si vous décidez de changer toutes vos séquences Push en séquences modales, ou un type de séquence personnalisé où vous faites votre propre effet visuel super cool, vous pouvez les sélectionner tous dans IB et changer le type de séquence en un seul clic au lieu de chasser autour de votre code.


De plus, que vous utilisiez la première ou la deuxième méthode, pousser un contrôleur de vue pour revenir "en arrière" à un contrôleur de vue précédent ne fonctionnera pas comme vos utilisateurs l'attendent. Lorsque vous poussez un SongViewController, il est ajouté à la fin de la pile de navigation:

LocationViewController -> SongViewController

Si vous appuyez à nouveau sur LocationViewController pour revenir en arrière:

LocationViewController -> SongViewController -> LocationViewController

Si l'utilisateur appuie sur le bouton de retour dans la barre de navigation, il reviendra de la vue de l'emplacement à la vue de la chanson à la vue de l'emplacement. (De plus, si vous continuez à faire cela, chaque "retour" et "avant" s'ajoutera à une chaîne toujours croissante de contrôleurs de vue, ce qui pourrait entraîner d'autres problèmes.)

Au lieu de cela, vous devez laisser le contrôleur de navigation gérer le retour. Il place un bouton dans la barre de navigation à cet effet, qui devrait gérer la plupart des cas d'utilisation. Si vous devez effectuer votre propre contrôle pour revenir en arrière, vous ne pouvez pas le faire dans IB avec iOS 5, mais vous pouvez le faire par programme avec le contrôleur de navigation popViewControllerAnimated: méthode.

36
rickster

Personnellement, j'utilise le # 2 lorsque je suis dans un UIViewController qui est sous un UINavigationController. Je ne pense pas que cela fonctionnera, il n'y a pas d'UINavigationController.

Lorsque j'utilise une vue qui se trouve sous un UITabBarController, j'utilise le code suivant pour passer à un autre onglet:

NSUInteger tabIndex = 2; // Index of the tab I want to select
UIViewController * viewCtrl = [_tabController.viewControllers objectAtIndex:tabIndex];
_tabController.selectedViewController = viewCtrl;
4
gfrigon