2011-03-24 3 views
13

J'ai une application dans laquelle je veux avoir une vue en arrière-plan (voir la vue du contrôleur), et en plus, plusieurs UIView s qui se dessinent comme des cercles. Je ne comprends pas comment mettre en œuvre tout cela tout en adhérant à MVC ...Présentation de Model-View-Controller

Le modèle et la vue doivent être différents. Cela signifie-t-il que j'ai généralement besoin d'un ensemble de fichiers d'en-tête et d'implémentation pour la vue et un autre ensemble (séparé) pour le modèle - même si mon objet est juste une classe Circle? Ou, aurais-je un Circle.h et Circle.m ensemble, puis à l'intérieur du fichier d'en-tête ont deux blocs d'interface, un pour le modèle et un pour la vue, et deux blocs d'implémentation (encore une pour le modèle et un pour la vue)?

J'ai vu que quelques personnes recommandent d'utiliser le contrôleur de vue pour gérer toutes les vues dans loadView et pour éviter de créer des objets de vue personnalisés distincts; cela signifie-t-il que je ne devrais pas créer un ensemble distinct de fichiers .h et .m pour la vue? Ce dernier semble beaucoup plus organisé en termes de design pour moi.

En outre, si je devais avoir plusieurs objets de vue et plusieurs objets de modèle gérés par le contrôleur de vue, je les stockerais dans deux tableaux dans le contrôleur - un pour les modèles, et un autre pour les vues. Droite? Ma question est: Quand j'utilise l'observation de valeurs-clés sur chaque modèle, comment, pour chaque objet de modèle, je modifierais l'objet de vue correspondant correct (en supposant que les index ne sont pas identiques pour les deux tableaux)? Je pensais à utiliser un pointeur vers l'objet du modèle à l'intérieur de la vue, et KVOing de la vue au modèle - mais alors il ne passe pas par le contrôleur et rompt donc MVC tout à fait, non?

Merci d'avance.

Répondre

23

MVC est une grande idée. C'est plus une philosophie directrice qu'une règle spécifique, et elle n'est pas toujours appliquée de la même manière. Lire Apple's discussion of MVC pour apprécier la différence entre MVC traditionnel et MVC dans Cocoa.

Il est difficile de dire comment appliquer MVC à votre application, car vous ne nous avez pas dit ce que l'application devrait faire , et aussi cela ne semble pas être une application réaliste. Je vais donc faire de mon mieux et faire quelques suppositions en cours de route. Une application qui dessine juste un tas de cercles dans des emplacements fixes sur un fond n'est pas très intéressante - elle pourrait être presque toutes les vues, à peine besoin d'un contrôleur du tout. Disons donc que les cercles se déplacent tous dans des directions différentes, sont dessinés dans des couleurs différentes, et changent de taille au fil du temps. Vous commencez maintenant à avoir besoin d'un modèle, de sorte que vous pouvez garder une trace des données que ces cercles représentent, et un contrôleur pour traduire le modèle en termes qui peuvent être représentés par les vues.

Puisque vous avez demandé spécifiquement sur les cercles de dessin, commençons par la vue. Cela semble être une bonne idée d'avoir une vue personnalisée qui sait comment dessiner un cercle en fonction des paramètres nécessaires: surface, couleur et position. Vous devriez probablement faire ces choses choses, et surcharger -drawRect: de telle sorte qu'il dessine un cercle de la zone donnée dans la couleur donnée. Nous ne savons pas ce que ces cercles représentent, mais ce n'est pas très amusant s'ils ne représentent pas quelque chose, alors supposons que le travail de l'application est de nous aider à comparer les entreprises. Nous avons des données sur le chiffre d'affaires, la capitalisation boursière, le nombre d'employés, la notation de crédit, le nom, le ticker, etc. Vous pouvez créer un objet personnalisé pour stocker toutes les données pour chaque société, ou tout mettre dans un dictionnaire. Notre modèle est un ensemble de ces objets ou dictionnaires personnalisés.

Remarquez que les vues en cercle ne connaissent rien aux sociétés et que le modèle ne sait rien des cercles. C'est une bonne chose. C'est aussi là que le contrôleur entre en jeu. Le contrôleur est l'endroit où vous mettez le code qui exprime visuellement le modèle en utilisant les vues. Il interprète également les événements à partir des vues, en mettant à jour le modèle si nécessaire. Ainsi, notre contrôleur connaît à la fois les particularités des sociétés et les propriétés de la vue circulaire. Il crée une vue circulaire pour chaque société du modèle. Je veux que la superficie d'un cercle corresponde à la capitalisation boursière de la société, la position verticale pour représenter le revenu et la position horizontale pour indiquer le nombre d'employés. Nous attribuerons une couleur en fonction de la cote de crédit de la société. Le contrôleur devrait, bien sûr, garder une trace de toutes les vues en cercle et un moyen de faire le lien entre les vues en cercle et les sociétés.

Maintenant vous avez quelque chose. C'est toujours une application assez simple, mais vous avez un tableau utile comparant les entreprises dans plusieurs dimensions. Améliorons-le. D'abord, il est difficile de savoir quel cercle représente quelle société. Ce serait bien si une vue en cercle pouvait éventuellement afficher du texte. Ajoutons les propriétés de titre et de sous-titre, et modifions -drawRect: pour dessiner ces chaînes respectivement au-dessus et en dessous du cercle. Nous changerons également le contrôleur de sorte qu'un clic ou un clic sur un cercle place le titre et le sous-titre de ce cercle au nom et au symbole de la société, ou les efface s'ils ont été précédemment définis. Deuxièmement, il est bon de comparer les entreprises à un moment donné, mais plus intéressant si nous pouvons montrer les changements au fil du temps. Modifions le modèle pour inclure des données historiques sur les revenus, la capitalisation boursière, les employés et la notation. Nous pouvons mettre à jour le contrôleur afin qu'il puisse utiliser les données historiques pour animer les cercles.

La première modification concernait la manière dont nous dessinions des informations à l'écran et ne nécessitait aucune modification du modèle. Le deuxième changement portait sur les données avec lesquelles nous devions travailler et ne nécessitait aucune modification de la vue. Vous pourriez facilement réutiliser la vue circulaire pour représenter d'autres types de données, ou peut-être même être la rondelle dans un match de hockey aérien. C'est juste un cercle coloré. Et vous pouvez réutiliser le modèle dans une autre application qui traite du même type de données. Je suis sûr que l'application hypothétique dans cette explication par exemple très longue ne ressemble en rien à votre propre application, mais peut-être que cela vous aidera à expliquer pourquoi MVC est utile et informez la structure de votre propre application. application. Bonne chance.

+3

Merci, cela aide vraiment. J'avais créé une application qui avait plusieurs cercles de masses différentes. Je voudrais définir certaines vitesses et utiliser certaines fonctions physiques que j'ai codées pour montrer des collisions d'impulsion entre des balles, tout comme dans un jeu de billard. Ils étaient des balles volantes libres qui sont entrées en collision, c'est tout. La façon dont j'ai créé cette petite application n'a pas suivi MVC à tous. Je viens d'un fond c/C# lourd, et n'ai jamais utilisé MVC, et donc un exemple est exactement ce dont j'avais besoin. Merci pour votre exemple, ça aide vraiment. – Dalisto1

+0

Super - content de pouvoir aider. – Caleb

4

J'ai obtenu de bonnes explications de CS193P DÉVELOPPEMENT D'APPLICATION D'IPHONE (hiver 2013).

Modèle-Vue-Contrôleur:

Diviser tous les objets en trois camps:

enter image description here

Modèle: Quelle votre demande est (une carte, une plate-forme, la logique de jeu de cartes)
Contrôleur: Comment votre modèle est présenté à l'utilisateur (UI Logic). Le contrôleur sait tout sur l'interface utilisateur.
Affichage: Les numéros de votre contrôleur.

Comment les camps communiquent:

enter image description here

Ne pas traverser la ligne jaune.
Vous pouvez traverser la ligne blanche en pointillés.
Certaines règles spéciales sont là pour traverser une ligne blanche.

enter image description here

Controller -> Voir (via Outlet)
Affichage -> Controller (via source de données (compte, dataAt), délégué (testament, devrait, a fait), Target action)
Modèle -> Contoller (via notification & Valeur clé d'observation)