2010-03-02 4 views
20

J'ai problème suivant:iPhone: Comment passer des données entre plusieurs Viewcontrollers dans une application Tabbar

J'ai construit une application avec 4 onglets barre d'onglets. Je veux passer un objet/une variable du premier contrôleur d'onglet au troisième et initialiser ce contrôleur avec l'objet correspondant.

J'ai déjà fait des recherches. La meilleure façon, correspondant à une approche de modèle propre, serait d'appeler une méthode initWithObject: sur le viewcontroller appelé. Comment puis-je y parvenir? Comment puis-je appeler la méthode init du Receivercontroller dans le callercontroller? Pouvez-vous me donner un exemple de code?

Modifier: Pour transmettre des données entre plusieurs vues/classes, créez simplement une sorte de classe de données qui contient les données partagées entre plusieurs classes. Pour plus d'informations, cliquez sur le lien suivant: Singleton

Répondre

28

Vous avez besoin d'un objet de modèle de données qui stocke les données pour l'application. Un modèle de données est un objet autonome et personnalisé accessible depuis n'importe où dans l'application. L'objet de modèle de données ne sait rien sur les vues ou les contrôleurs de vue. Il stocke simplement les données et les relations logiques entre ces données.

Lorsque différentes parties de l'application doivent écrire ou lire des données, elles écrivent et lisent dans le modèle de données. Dans votre cas, view1 enregistrerait ses données dans le modèle de données lors du déchargement, puis view2 lirait ces données à partir du modèle de données lors du chargement (ou vice versa.)

Dans une application correctement conçue, il n'y a pas deux contrôleurs de vue devrait avoir accès aux données internes d'un autre contrôleur. (La seule raison pour laquelle un contrôleur de vue doit connaître l'existence d'un autre contrôleur est s'il doit déclencher le chargement de cet autre contrôleur.)

La façon rapide et sale pour créer un modèle de données est d'ajouter des attributs au délégué de l'application, puis appeler le délégué de l'application des contrôleurs de vue à l'aide:

YourAppDelegateClass *appDelegate = [[UIApplication sharedApplication] delegate]; 
myLocalProperty = appDelegate.someDataModelProperty; 

Cela fonctionne pour petit projet, mais comme Vos données deviennent complexes, vous devez créer une classe dédiée pour votre modèle de données.

Edit:

Pour clarifier pour votre cas, vous devez ajouter l'appel au modèle de données lorsque le récepteur viewController devient actif.

Le placement des données dans une méthode init ou un viewDidLoad ne fonctionnera pas car, dans un UITabBar, les utilisateurs peuvent basculer entre eux sans décharger la vue ou réinitialiser le contrôleur de vue.

Le meilleur endroit pour récupérer des données modifiées est la méthode de contrôleur viewWillAppear. De cette façon, les données seront mises à jour chaque fois que l'utilisateur passe à cet onglet.

+1

Merci beaucoup. J'utilise maintenant l'approche singleton. J'ai également posté un lien vers un bon tutoriel qui décrit les étapes à suivre pour créer un modèle de données singleton. –

4

Vous voudrez peut-être envisager NSNotificationCenter (Reference); vous enregistrez le one viewcontroller avec le centre de notification d'application et envoyez une notification lorsqu'une sélection est effectuée. Lorsque la notification est reçue, l'autre viewcontroller se met à jour en conséquence.

+0

C'est vrai, mais je pense que vous ne pouvez pas passer des objets via NSNotificationCenter. Donc, je pourrais envoyer une notification au receiverController. Mais alors j'ai toujours le problème que j'ai besoin de mes paramètres init pour lancer le nouveau viewcontroller. –

+4

Vous auriez tort. Vous pouvez parfaitement passer des objets via 'NSNotificationCenter'. Vous pouvez utiliser, par exemple; '- (void) postNotificationName: (NSString *) objet notificationName: (id) notificationSender userInfo: (NSDictionary *) userInfo', ou simplement' + (id) notificationWithName: (NSString *) objet aName: (id) anObject' –

0

Je ne pense cependant que j'ai pas est la meilleure pratique (aussi vérifier la syntaxe) n'y trouva rien à:

dans le .h

otherclassref *otherclassname 

@property (assign) otherclassname otherclassref; 

et dans le .m

@synthesize otherclassref; 

puis je viens d'attribuer la référence de quelque part pratique par exemple le délégué de l'application ou partout où vous instanciez vos viewcontrollers.

puis le contrôleur de vue peut obtenir une référence à l'autre contrôleur de vue. J'applique @class secondviewcontroller au fichier .h pour le premier viewcontroller et place le #imports "secondviewcontroller.h" dans le fichier .m du premier contrôleur de vue. Ces références sont appelées forward et empêchent les erreurs du compilateur résultant du fait que les fichiers .h se référencent mutuellement.

+0

fonctionnera mais ce n'est pas une bonne pratique parce que la complexité des références entre les contrôleurs de vue va faire boule de neige lorsque vous ajoutez des vues. L'ajout ou la suppression d'un contrôleur de vue implique la mise à jour de plusieurs autres. Un contrôleur de vue peut manipuler les données contenues dans un autre. – TechZen

+0

@TechZen yep me semble raisonnable – PeanutPower

Questions connexes