2010-08-06 5 views
2

Avant de poser cette question ici, j'ai googled aroung. En général, les gens suggèrent deux façons de transmettre des valeurs/paramètres entre NavigationControllers:Quelle est la meilleure pratique pour passer la valeur/paramètre entre les NavigationControllers?

  1. Via propriétés à la racine ViewController
  2. Via Modèles de données

Je sais déjà que le premier choix ne peut pas être la meilleur entrainement. Beaucoup de gens semblent adopter cette pratique. Cependant, je ne comprends toujours pas comment la deuxième pratique peut être mise en œuvre. Est-ce que quelqu'un connaît un tutoriel?

De plus, est-il possible de passer la valeur/paramètre vers le bas à travers les constructeurs? Je suppose que le seul problème avec cela est de récupérer la valeur/paramètre de sous-viewcontrollers.

+1

Voulez-vous dire entre View Controllers? Utilisez les délégués pour transmettre des informations à la hiérarchie du contrôleur de vue. Utilisez des méthodes d'initialisation personnalisées (ou définissez des ivars directement, avant le push mais après la création dans le contrôleur de vue push) pour transmettre des informations dans la hiérarchie. –

+0

oui, avez-vous un exemple facile disponible? Merci –

Répondre

4

Ce fichier définit le protocole délégué:

@protocol VCDelegate 

- (void)notifyParent:(NSString*)someString; 

@end 

Vous pouvez l'inclure dans le .h de tout contrôleur de vue que vous définissez. Dans ce contrôleur de vue que vous déclarez une Ivar:

id<VCDelegate> delegate; 

Dans le contrôleur de vue dans lequel vous créez le contrôleur de vue de l'enfant que vous incluez .h du contrôleur de votre vue enfant comme d'habitude. Cependant, vous ajoutez

<VCDelegate> 

pour indiquer qu'il met en oeuvre le protocole que vous avez défini, comme vous le feriez si vous indiquant qu'il a mis en œuvre UITableViewDelegate - vous définissez un délégué qui fonctionne de la même façon.

Lorsque vous créez votre contrôleur de vue de l'enfant:

MyChildViewController* myCVC = [[MyChildViewController alloc] initWithString:(NSString*)someString]; 
    myCVC.delegate = self; 

Alors maintenant, le contrôleur de vue de l'enfant a un délégué qui est le contrôleur de vue parent, celui que vous créez l'enfant et celui qui le pousser sur la pile de nav. Vous devez bien sûr implémenter la fonction delegate dans le contrôleur de la vue parente:

Incidemment, c'est ici que vous pouvez passer des informations dans la pile - il suffit de définir les ivars après la création, comme vous le faites pour le délégué ivar. Vous remarquerez qu'il existe un initWithString qui transmet une chaîne à une méthode init personnalisée, c'est une autre façon de transmettre des informations. Vous faites toujours toutes les choses initiales normales, transmettez simplement des données supplémentaires.

- (void)notifyParent:(NSString*)someString 
{ 
    NSLog(@"Child view controller says %@", someString); 
} 

Et puis dans le contrôleur de vue de l'enfant que vous pouvez faire

[self.delegate notifyParent:@"Hello"]; 

PRESTO - parent VC reçoit les données de l'enfant VC.

+0

C'est génial !! Que vous pour ce bel exemple. –

Questions connexes