3

Étant donné la section d'une application qui a un UINavigationController et 2 niveaux de UITableViews (ie une ligne est sélectionnée sur le contrôleur racine qui pousse le second contrôleur sur la pile de navigation) J'ai les questions suivantes:Communication entre view controllers

1) Il y a un objet Utilisateur requis par les deux contrôleurs. Quel est le meilleur moyen de communiquer entre les deux contrôleurs? J'ai vu un post sur ce site qui mentionne injection de dépendance et que le contrôleur racine pourrait passer l'objet utilisateur au second contrôleur de niveau par:

@implementation SecondLevelViewController 

-(void) initWithUser: (User *) user { 
    // myUser is an instance variable 
    myUser = user; 
    [myUser retain]; 
} 

Dans cet exemple le deuxième contrôleur semble retenir l'utilisateur alors que j'ai vu d'autres sources (par exemple le cours de développement de l'iPhone de Stanford) qui préconisent que l'utilisateur soit simplement affecté, et non retenu, dans cette situation (couplage lâche).

J'ai également vu des arguments pour une forme de délégation où un objet id assigné serait utilisé sur le second contrôleur (plutôt qu'une variable d'instance User conservée comme ci-dessus).

Ce serait génial si quelqu'un pouvait clarifier cette position pour moi car je suis extrêmement confus par les conseils apparemment contradictoires dans ce domaine. Quel est le meilleur moyen de communication entre les contrôleurs de vue?

2) Ma deuxième question concerne également la structuration des contrôleurs. J'ai vu des exemples où le contrôleur de racine (dans l'arrangement ci-dessus) a un tableau de contrôleurs de second niveau instanciés. Est-ce normal dans une application professionnelle ou y aurait-il un impact significatif sur la mémoire pour faire les choses de cette façon (c'est-à-dire sans chargement paresseux)? Je suppose que l'avantage de la matrice est une réduction des temps de chargement pour les contrôleurs de second niveau?

Merci pour toutes les réponses que j'essaie de développer les choses correctement plutôt que de les bidouiller ensemble.

Répondre

3

1) "Quel est le meilleur moyen de communication entre les contrôleurs de vue?"

Il n'y a pas de "meilleure" façon. Vous pouvez certainement passer un objet de modèle au contrôleur de vue lors de l'initialisation. Dans ce cas, le contrôleur doit généralement conserver le modèle. Aller avec un délégué est une bonne option si vous écrivez une classe de contrôleur de vue générale en mettant l'accent sur la réutilisabilité (comme UITableViewController).

2) « Je l'ai vu des exemples où le contrôleur racine (dans l'arrangement ci-dessus) a une série de contrôleurs de second niveau instanciés. Est-ce normal dans une application professionnelle »

Tout d'abord, vous devez limiter vos messages sur SO à une question par poste. L'impact de mémoire d'un contrôleur de vue lui-même est généralement assez faible. Il n'a besoin que de quelques centaines d'octets pour ses variables d'instance. La partie de mémoire-intensive sont les vues elles-mêmes. Et le mécanisme de chargement/déchargement des vues de UIViewController prendra soin de décharger la vue nécessitant beaucoup de mémoire si nécessaire (c'est-à-dire si elle reçoit un avertissement de mémoire et que la vue n'est actuellement pas à l'écran). Donc, tant que vous implémentez correctement viewDidLoad, viewDidUnload et didReceiveMemoryWarning, je ne m'inquiéterais pas trop de la consommation de mémoire d'un tableau de contrôleurs de vue.

UITabBarController contient également un tableau de sous-contrôleurs, donc il n'y a rien de mal à cela. Ce que vous devriez éviter, cependant, est que l'un des contrôleurs détienne toute une hiérarchie de sous-contrôleurs (non seulement de second niveau, mais aussi de troisième niveau, etc.): pas tant pour des problèmes de mémoire que pour éviter un couplage inutile.

+0

Merci pour vos réponses Ole et moi prenons note de votre commentaire concernant un article par question. Cependant, j'étais curieux de savoir si l'approche de la matrice (mentionnée dans ma deuxième question) a des avantages en termes de vitesse de chargement ou est-ce simplement un moyen utile de structurer votre code? – Urizen

+0

Instancier un objet contrôleur de vue ne devrait pas prendre beaucoup de temps, donc je dirais que les avantages de la vitesse de chargement sont insignifiants. Ce qui prend du temps est le chargement de la vue, mais l'approche du tableau ne change pas le fait que le contrôleur de vue chargera la vue de toute façon. –

+0

Merci encore. Des réponses très utiles – Urizen

1

En général, vous devriez essayer d'éviter de transmettre directement des données entre les contrôleurs.

Vous pouvez configurer votre modèle auquel chaque contrôleur a accès, puis vous pouvez implémenter des notifications pour informer l'autre contrôleur qu'un événement s'est produit. L'autre contrôleur peut obtenir toutes les données nécessaires du modèle.

De cette façon, vous gardez vos contrôleurs séparés.