J'ai utilisé NSWindowController dans des projets à plusieurs reprises, et se sentir comme j'ai une (très)approximative de saisir les concepts de base de cette classe importante. Ce que je voudrais faire avec ce post est de clarifier ou corriger ma propre compréhension, et j'espère aider d'autres apprenants obtenir que la première étape dans la compréhension. C'est la d'un coup d'œil concepts, vue d'ensemble, et les meilleures pratiques que je trouve est le plus utile, et souvent défaut dans la documentation. Voici mon point de vue sur NSWindowController (les questions sont réparties en gras):
- Un NSWindowController (NSWC) sous-classe existe (conceptuellement) juste en dessous de chaque fenêtre de plume, agissant en tant que la colle entre les éléments de l'interface utilisateur et le modèle des objets qu'ils/contrôle de représenter. Fondamentalement, toutes les fenêtres de votre application doit avoir son propre NSWC sous-classe.
- Le Propriétaire du Fichier de la plume doit toujours être le NSWC sous-classe. Est-ce le cas même pour le MainMenu.xib application?
- Le NSWC
window
de la propriété doit toujours être reliée à la NSWindow dans InterfaceBuilder. - Vous devez remplacer le "init" la méthode, à l'aide de
[super initWithWindowNibName:]
, de sorte que lorsque vous vous référez à l'[mycontroller window]
il va charger la plume. Faut-il aussi être le cas pour la NSWC pour le MainMenu.xib fenêtre, même si c'est ouvert au démarrage? - Le NSWC ne devrait pas faire trop lourd de levage - il doit simplement transmettre des messages à des instances d'objets, et ces objets dans l'INTERFACE utilisateur.
- Il peut modifier l'INTERFACE utilisateur à l'aide d'une liaison ou d'agir en tant que délégué pour les tables etc., ou par activement à changer les éléments de l'INTERFACE utilisateur lorsqu'il observe un changement, ou une combinaison de tout ce qui précède (celui que vous utilisez semble être une question de goût, avec les avantages et les inconvénients de tous les côtés).
- Un NSWC peut créer des instances d'autres NSWCs lorsque nécessaire (par exemple, lors de l'ouverture d'une sous-fenêtre).
-
Utiliser l'
[mycontroller showWindow:nil]
pour afficher la fenêtre associée à l'avant. Si vous voulez voir apparaître la fenêtre comme une feuille, utilisez quelque chose comme:NSWindowController* mycontroller = [[MyController alloc] init]; [NSApp beginSheet: [mycontroller window] modalForWindow: [self window] modalDelegate: self didEndSelector: @selector(didEndMySheet:returnCode:contextInfo:) contextInfo: nil];
L' didEndSelector:
devrait être une méthode de la NSWC de la fenêtre parent, et que vous pouvez accéder et de liberté", mycontroller " avec [sheet windowController]
.
- Pour fermer la fenêtre d'appel de l' performClose:
méthode de NSWC de la fenêtre.
Quelques Questions:
- Si le NSWC de la MainMenu fenêtre également être l'application délégué, ou devrait-il être une classe différente?
- Dans la même veine, la NSWC gérer les fichiers (glisser/déposer et d'ouverture), ou doit-il être transmis au délégué d'application, ou est-ce juste une question de goût?
S'il vous plaît corrigez-moi si tout cela est une mauvaise pratique, ou est tout simplement faux. Je suis à la recherche de clarifier ma compréhension de NSWindowController, de sorte que tous les ajouts (sous la forme de bonnes pratiques, des expériences, des pièges) serait très appréciée.
Merci, Laurie