2010-07-17 6 views
6

Je commence donc à apprendre à utiliser Cocoa. Je pense que je l'ai eu à peu près, mais je suis accroché sur la création et la commutation des vues. Je suis en train de réécrire un jeu que j'ai fait il y a quelques temps pour m'entraîner. Tout ce que je veux, c'est une fenêtre (de préférence non redimensionnable) et je veux pouvoir changer de vue pour différents écrans du jeu. J'ai d'abord le menu principal (Démarrer le jeu, Meilleurs scores, Quitter). Ensuite, j'ai besoin d'une fenêtre pour chaque écran (écran de jeu, écran Highscore).Comment désactiver les vues dans une application Cocoa?

Ce que je suis confondu avec est de savoir comment concevoir cela. J'ai cherché NSViewController en pensant qu'il gère les vues, mais ce n'est pas le cas. Il ne gère qu'une vue en la chargeant vraiment. Je ne comprends pas pourquoi je devrais utiliser NSViewController alors. Je ne pourrais pas juste avoir une classe de fenêtre qui contient plusieurs sous-classes de NSView et les charger comme ça? Je ne suis pas sûr de comprendre le but du ViewController.

Est-ce que ma classe de fenêtres doit vraiment sous-classer NSWindowController? J'essayais de suivre l'exemple de l'exemple ViewController d'Apple et il a une classe de contrôleur de fenêtre qui est une sous-classe de NSWindowController. Je ne vois pas quel était le but de la sous-classification. Tout NSWindowController semble ajouter est - initWithPath:(NSString *)newPath mais je ne vois pas l'utilisation dans ce soit quand je peux simplement modifier le fichier plist pour ouvrir la fenêtre au démarrage. L'exemple d'Apple a également une variable NSView et une variable NSViewController. Vous n'avez pas besoin d'une seule variable pour stocker la vue actuelle?

Merci d'avance les gars, je suis vraiment confus quant à la façon dont cela fonctionne.

Répondre

1

Utiliser les fonctions suivantes définies dans UIVew (qui fait partie de votre fenêtre existante)

- (void)addSubview:(UIView *)view 
- (void)removeFromSuperview 
+0

Je fais Cocoa sur le bureau en ce moment. –

+2

même interface disponible dans Desktop (NSView) –

+0

Donc ce que je voudrais savoir, c'est pourquoi devrais-je utiliser NSViewController. Devrais-je? Dois-je créer une sous-classe de NSWindowController avec une variable NSView et NSViewController? Je ne suis pas sûr de ce qui est vraiment nécessaire pour faire une fenêtre avec des vues commutables. D'après ce que je comprends, je n'ai pas du tout besoin de NSViewController mais je ne sais pas puisque l'exemple d'Apple l'a utilisé et c'est censé faciliter les choses pour vous. –

5

Vous utilisez NSWindowController et NSViewController pour gérer une fenêtre ou une vue parce que vous ne devriez avoir besoin de créer des sous-classes de NSWindow ou NSView pour de nouveaux "types" de fenêtre ou de vue. Par exemple, si vous souhaitez utiliser une fenêtre circulaire, vous devez sous-classer NSWindow. Si vous voulez juste avoir des contrôles dans une fenêtre, vous sous-classez NSWindowController.

Il est la même chose avec NSViewController: En général, une vue NSViewController's sera d'une classe de base telle que NSView (ou peut-être votre propre NSView sous-classe qui dessine un arrière-plan personnalisé). Le NSViewController gère l'interaction entre les sous-vues de cette vue, lui permettant d'agir comme une seule unité au sein de votre plus grande application. Pensez-y de la façon suivante: Les vues sont dessinées et elles transforment les événements d'entrée bruts en actions de niveau supérieur. Les contrôleurs fournissent des informations aux vues et gèrent les actions.

Composer les choses de cette façon peut grandement améliorer la modularité de votre code, en facilitant la conception, l'écriture et le débogage.

+0

Je suppose que cela fait un peu plus de sens. Pensez-vous que je devrais utiliser 'initWithNibName: bundle:' pour charger la vue ou est-ce que je pourrais simplement définir le "propriétaire du fichier" de la vue sur le ViewController? –

+0

Vous devez faire les deux. Vous utilisez '-initWithNibName: bundle:' pour instancier votre sous-classe NSViewController. Cela charge le fichier nib spécifié et agit comme son propriétaire de fichier; Définissez la classe du propriétaire du fichier de la plume sur votre sous-classe NSViewController et pointez sur le point de vue «Vue» du propriétaire du fichier. –

4

Il semble que vous essayez d'échanger la vue de contenu dans une fenêtre? Si tel est le cas, vous pouvez utiliser -[NSView replaceSubview:with:] avec -[NSWindow contentView] comme récepteur. Supposons que vous ayez une page de titre nommée titleView et une page de menu nommée menuView et que vous souhaitiez les échanger à l'intérieur et à l'extérieur de la fenêtre principale de votre application.Si la page de titre est visible et l'utilisateur clique sur un bouton « menu principal » ou un lien, vous mettez quelque chose comme ceci dans la méthode de délégué du bouton:

[[[NSApp mainWindow] contentView] replaceSubview:titleView with:menuView]; 

Deux choses à connaître:

  1. L'ancienne vue, titleView dans ce cas, est libérée par cet appel. Si vous voulez qu'il soit encore disponible, vous devrez le retain avant de le remplacer.
  2. La vue parent ne sera pas redimensionnée si vos pages ont des dimensions différentes. Changer la taille de l'image de la fenêtre, et par conséquent le contentView est assez facile, mais vous pouvez ajouter un peu d'animation de base dans le mélange pour lui donner du style.

J'espère que cela aide!

+0

Très bien, merci! Je vais examiner cela aussi. Vous êtes tous très utiles. –

0

Je suis novice dans le domaine du cacao, mais je pense que votre application ne nécessite pas vraiment un NSViewController. Un NSViewController joue le rôle de "Controller" dans le modèle de conception MVC. Ainsi, il «contrôle» toutes les actions - la logique de collage - au sein d'une même vue. Par exemple, dans une vue avec plusieurs contrôles: boutons, tableaux, cases à cocher :, champs de texte, sélecteurs de date, etc., il existe probablement des interactions détaillées entre les contrôles qui nécessitent des liaisons et des mises à jour. Par exemple, un clic sur un bouton charge une extraction de base de données, avec gestion et validation des erreurs. Cette logique de collage va dans la classe NSViewController.

Dans votre application, il semble que chaque vue soit une page simple nécessitant peu de contrôle au niveau de la vue. Donc, vous avez probablement besoin d'un seul NSWindowController, un contrôleur pour gérer la logique et des événements pour la transition de page en page. Une technique permettant de gérer plusieurs vues qui remplissent une seule fenêtre consiste à utiliser une NSTabView et à définir le style de tabulation sur 'sans bordure' dans IB. Ensuite, utilisez l'action du bouton pour sélectionner le NSTabViewItem requis. Au cours du développement, définissez le style tabview sur «Onglets supérieurs» et IB vous permet d'effectuer un tabulation à travers les sous-vues que vous souhaitez afficher.

Questions connexes