2010-12-11 25 views
2

J'implémente une méthode - (void) delete: je peux donc gérer la touche delete de mon application Cocoa. Je veux qu'il fasse des choses différentes selon ce qui est sélectionné: pour les champs de texte, je veux le comportement par défaut (enlever le caractère à gauche), mais pour les éléments de NSBrowser, je veux qu'il supprime l'élément.Qu'est-ce qu'un NSBrowserTableView par rapport à un NSBrowser?

J'ai pensé que je demanderais à la fenêtre pour son premier répondeur, puis voir si ce premier répondeur est égal au pointeur pour mon NSBrowser, mais il n'a jamais correspondu. Lorsque je le débogue, je trouve que le firstResponder pointe vers une instance de NSBrowserTableView, mais je ne le trouve pas dans la documentation.

Qu'est-ce que c'est?

Et comment pourrais-je tester pour voir si mon firstResponder est un tableauView particulier? (J'ai pensé à sous-classer NSBrowser mais j'ai tendance à éviter le sous-classement, et ma deuxième pensée était d'ajouter une balise, mais j'aime mieux ma première méthode, si seulement le premier répondeur pointe vers mon instance NSBrowser quand un des éléments du navigateur est sélectionné.)

Pensées?

Répondre

-1

Vous ne pouvez pas trouver cela dans la documentation parce que c'est privé. Ma supposition est que, lorsque vous instanciez un NSBrowser ou un NSTableView, vous êtes en train d'instancier une sous-classe de cette classe privée, qui est elle-même une sous-classe de NSControl (est indiqué dans la documentation comme étant la superclasse de NSBrowser et NSTableView). Un autre exemple est NSString représenté en tant que «NSCFString», que je considère comme une allusion au fait que CFString et NSString sont «pontés sans frais». Prenez ceci avec autant de grains de sel que vous le souhaitez, mais la façon dont j'irais dans le premier répondeur est d'insérer une instruction NSLog dans mon code et de la casser juste au-delà, voir ce qui était imprimé dans le bûche. Vous pouvez définir l'étiquette de la vue et l'afficher dans la déclaration. Ou vous pouvez demander la classe de votre premier répéteur

NSStringFromClass([myFirstResponder class]) 

et l'afficher.

J'espère que cela a aidé.

4

En fait, @trudyscousin n'est que partiellement correct. Cette classe est certainement pas une sous-classe de NSBrowser.

NSBrowserTableView est une sous-classe privée de NSTableView utilisée par NSBrowser pour afficher chaque colonne. La vue de table est utilisée de sorte qu'il existe un emplacement distinct pour dessiner l'image de branche (la petite flèche dessinée à côté des dossiers) tout en laissant le reste de la ligne à dessiner soit par défaut soit par la cellule définie par l'utilisateur.

Si vous y pensez, il est logique que la vue de la table (plutôt que le navigateur) soit le premier répondeur, car alors la table de la colonne active obtient la première réponse aux frappes, et NSBrowser peut laisser NSTableView fais ce qu'il sait déjà faire. (Par exemple, en sautant à la première ligne qui correspond à une lettre tapée par l'utilisateur.)

Heureusement, NSBrowserTableView a un pointeur vers le navigateur pour lequel il travaille. Vous pouvez y accéder via sa méthode -(NSBrowser*)browser. Je vous recommande de ne pas sous-classer NSBrowser pour ce cas particulier, car vous devez avoir une connaissance approfondie de son implémentation privée pour faire quelque chose d'utile.

+0

Si vous faisiez cela, Apple ne vous laisserait pas sur l'App Store, car il n'est pas documenté. – tbodt