2010-03-27 6 views
0

J'ai récemment fait beaucoup de programmation en Objective-C, et je suis revenu dans le développement de l'iPhone. J'ai fait beaucoup de programmation en utilisant MVC dans d'autres langages/frameworks, mais je veux juste m'assurer que j'utilise MVC correctement dans mon développement iPhone.iPhone: bon usage de View and View Controller

J'ai créé une nouvelle application iPhone Utility, qui crée deux vues: MainView et FlipsideView. Les deux ont un contrôleur (FlipsideViewController et MainViewController) et le fichier XIB de leurs propres. Ce que j'ai fait est de mettre les variables IBOutlet UIControl myControl dans mes fichiers MainView.h ou FlipsideView.h, puis d'attacher les contrôles dans Interface Builder à ces variables. Puis j'ai mis toutes les méthodes IBAction SomeAction myAction dans les fichiers MainViewController.h et FlipsideViewController.h et en attachant les événements à ces méthodes dans Interface Builder.

Cela semble être conceptuellement correct, mais semble causer des problèmes. Dites que j'ai un bouton qui, lorsqu'on clique dessus, modifie le texte d'une étiquette. Le contrôleur n'a donc aucune idée du nom de la variable de l'étiquette dans le gestionnaire d'événements OnTouchUp pour mon bouton. Donc, je fais un @property pour cela. Mais puisque la propriété MainViewController.view n'est pas de type MyView, j'obtiens des avertissements ou des erreurs chaque fois que j'essaie d'accéder à ces propriétés à partir du contrôleur de vue.

Je le fais correctement? Y a-t-il une meilleure manière de faire cela? Si cela est correct, comment puis-je travailler correctement avec ces variables sans recevoir d'avertissement ou d'erreur?

Merci

Voici un code montrant ce que je fais:

MainView.h

#import ... 

@interface MainView : UIView 
{ 
    IBOutlet UILabel* label; 
    IBOutlet UIButton* button; 
} 

@property UILabel* label; 
@property UIButton* button; 

@end 

MainViewController.m

-(void) buttonTouchUp:(id) sender 
{ 
    self.view.label.text = @"The button was pressed!"; //This gives error because label is not in the view structure or union 
    [self.view label].text = @"The button was pressed!"; //This gives a warning 
} 

Je sais que je peux jeter la vue être du bon type, mais cela semble être un travail de hacking. Je sais que je peux vivre avec l'avertissement, mais un avertissement me dit que je fais quelque chose que je ne devrais probablement pas faire. Je ne crois pas que le SDK m'aurait obligé à faire quelque chose comme ça tout le temps.

Je dois juste me méprendre sur ce que le View est censé être et je l'utilise incorrectement.

+0

"Le contrôleur n'a donc aucune idée du nom de la variable de l'étiquette dans le gestionnaire d'événement OnTouchUp pour mon bouton, donc je lui ai attribué un @property, mais comme la propriété MainViewController.view n'est pas de type MyView, j'obtiens des avertissements ou des erreurs chaque fois que j'essaie d'accéder à ces propriétés à partir du contrôleur de vue. " - pourriez-vous poster le code pertinent? –

Répondre

2

La plupart du code que j'ai vu et écrit moi-même garde toutes les sorties et les actions sur le contrôleur. Le bouton envoie un message au contrôleur (via IBAction), puis le contrôleur met à jour l'étiquette (via IBOutlet). En d'autres termes, mettre des points de vue sur vos points de vue est inhabituel. Les vues ne doivent pas être connectées à d'autres vues sauf si elles ont une relation spéciale, comme peut-être des boutons Précédent/Suivant qui ciblent un UIWebView ... mais même alors, vous trouvez que vous avez besoin d'un contrôleur pour activer/désactiver les boutons le cas échéant.

+0

donc si je mets tout sur le ViewController, à quoi bon avoir la classe View en premier lieu? Si je ne fais que tout mettre dans le ViewController? – Joel

+2

Le point d'une classe View est de dessiner des éléments à l'écran et de recevoir des événements tactiles. La plupart du temps, vous utilisez les classes d'affichage d'Apple, vous écrivez uniquement les vôtres pour un widget personnalisé ou si vous écrivez un jeu. – benzado

+0

Oh, d'accord. J'étais juste confus de ce que la vue a été utilisée pour. Je suppose que j'ai du code à réparer. Cela a beaucoup plus de sens. Merci pour la clarification. – Joel

Questions connexes