Ajouter une méthode au protocole NSBrowserDelegate ? À quoi cela peut-il bien servir ? (De toute façon, c'est impossible, les catégories sont résolues à l'exécution et ne portent que sur les classes).
Si tu crées une sous-classe de NSBrowser (mauvaise idée) qui a besoin d'ajouter des méthodes à son délégué, le plus simple est sans doute de créer un nouveau protocole pour cette sous-classe. Le délégué devra alors se conformer aux deux protocoles.
dans le controleur, il suffit d'implémenter (ou pas) la méthode: -(void)browser:(NSBrowser*) browser didEndEditing:(NSString*) newTitle forCell:(CSBrowserCell*) cell
et voilà c'est tout simple.
Cette classe m'a servi pour refaire l'exemple SimpleBrowser (tout pourri) d'Apple. Je le joins à ce message. Si vous pouviez ne dire si celui fonctionne sur vos machines (sous Tiger et plus), ça serait super sympa
Par défaut, un double-clic sur une cellule ouvre le fichier dans le Finder. Pour éditer un cellule (voir bouton Options), il faut appuyer sur ENTER (l'édition, ne fait rien en fait)
Je n'ai probablement pas tout compris. Chez moi, l'application se lance, trouve le disque dur, mais n'affiche jamais rien dans les colonnes. Donc je ne comprends pas! Si non, pas de plantage.
(MacBook Pro 15", 2,66Ghz Intel Core 2 Duo, OSx 10.6.5)
Je n'ai probablement pas tout compris. Chez moi, l'application se lance, trouve le disque dur, mais n'affiche jamais rien dans les colonnes. Donc je ne comprends pas! Si non, pas de plantage.
(MacBook Pro 15", 2,66Ghz Intel Core 2 Duo, OSx 10.6.5)
Merci de ta réponse.
Tu me confirmes un problème avec Snow ! Incompréhensible, ça marche sur Tiger et Léo. J'ai vérifié que la matrix de la 1er colonne est bien remplie, mais rien ne s'affiche !
Ma conclusion est que c'est la méthode: browser:createRowsForColumn:inMatrix: qui pose problème, et donc que le mode active delegate ne fonctionne plus sous Snow >:(
Je dois surchager la methode keyDown d'un NSBrowser, en effet le comportement des arrowKeys ne me convient pas. La arrowKey "right" selectionne tjrs la 1er cellule de la matrice, alors que je souhaite suivre mon propre chenin.
Cette fonction (forward) existe dans mon controller, le browser est pilotable de "l'exterieur".
Donc je sous-classe NSBrowser, je surchage keyDown et appelle la methode de mon controller.
C'est ok, ca fonctionne, avec le comportement attendu.
Mais c'est un peu spaghetti, le controller/modele doit connaitre la vue et la vue le controller/modele (typage fort)
J'aimerai reproduire ce comportement avec un protocol:
NSBrowser possede deja id<NSBrowserDelegate> delegate (je pense)
La methode "forward" ferait parti d'un protocol complementaire
Je n'ai probablement pas tout compris. Chez moi, l'application se lance, trouve le disque dur, mais n'affiche jamais rien dans les colonnes. Donc je ne comprends pas! Si non, pas de plantage.
(MacBook Pro 15", 2,66Ghz Intel Core 2 Duo, OSx 10.6.5)
J'ai enfin isolé le problème:
-(void)browser:(NSBrowser*)sender createRowsForColumn:(int)column inMatrix:(NSMatrix*)matrix<br />{<br />NSFileManager* fileManager=[NSFileManager defaultManager];<br />NSString* path=[self pathForColumn:column];<br />NSArray* files=[self directoryContentsAtPath:path];<br /><br />[matrix renewRows:[files count] columns:1];<br /><br />int i;<br />for(i=0;i<[files count];i++)<br />{<br />NSString* file=[files objectAtIndex:i];<br />PathBrowserCell* cell=(PathBrowserCell*)[matrix cellAtRow:i column:0];<br /><br />[cell setLeaf:[self isLeafAtPath:file]];<br />[cell setRowImage:[[NSWorkspace sharedWorkspace] iconForFile:file]];<br />[cell setTitle:[fileManager displayNameAtPath:file]];// nom affiché<br /> [cell setRepresentedObject:[file lastPathComponent]]; // nom réel<br /> [cell setInvisible:[self isInvisibleFileAtPath:file]];<br /> } <br /> <br /> // ------------- bug sous 10.6 ! ---------------<br /> [matrix setAutosizesCells:YES]; // pour que le field editor (cellule en édition) se redimensionne<br /> <br /> [oPathTextField setStringValue:path]; // affiche le chemin réel<br />}<br />
Et du coup, si je supprime cette ligne, j'ai un bug d'affichage >:(
Réponses
Si tu crées une sous-classe de NSBrowser (mauvaise idée) qui a besoin d'ajouter des méthodes à son délégué, le plus simple est sans doute de créer un nouveau protocole pour cette sous-classe. Le délégué devra alors se conformer aux deux protocoles.
j'ai besoin d'un comportement spécifique en réponse aux arrowKeys, la seul idée que j'ai eu c'est redefinir keyDown et donc sous classer NSBrowser.
je vais regardé cela
dans le controleur, il suffit d'implémenter (ou pas) la méthode:
-(void)browser:(NSBrowser*) browser didEndEditing:(NSString*) newTitle forCell:(CSBrowserCell*) cell
et voilà c'est tout simple.
Cette classe m'a servi pour refaire l'exemple SimpleBrowser (tout pourri) d'Apple.
Je le joins à ce message.
Si vous pouviez ne dire si celui fonctionne sur vos machines (sous Tiger et plus), ça serait super sympa
Par défaut, un double-clic sur une cellule ouvre le fichier dans le Finder.
Pour éditer un cellule (voir bouton Options), il faut appuyer sur ENTER (l'édition, ne fait rien en fait)
Si non, pas de plantage.
(MacBook Pro 15", 2,66Ghz Intel Core 2 Duo, OSx 10.6.5)
Merci de ta réponse.
Tu me confirmes un problème avec Snow !
Incompréhensible, ça marche sur Tiger et Léo.
J'ai vérifié que la matrix de la 1er colonne est bien remplie, mais rien ne s'affiche !
Ma conclusion est que c'est la méthode:
browser:createRowsForColumn:inMatrix:
qui pose problème,
et donc que le mode active delegate ne fonctionne plus sous Snow >:(
J'explique:
Je dois surchager la methode keyDown d'un NSBrowser, en effet le comportement des arrowKeys ne me convient pas.
La arrowKey "right" selectionne tjrs la 1er cellule de la matrice, alors que je souhaite suivre mon propre chenin.
Cette fonction (forward) existe dans mon controller, le browser est pilotable de "l'exterieur".
Donc je sous-classe NSBrowser, je surchage keyDown et appelle la methode de mon controller.
C'est ok, ca fonctionne, avec le comportement attendu.
Mais c'est un peu spaghetti, le controller/modele doit connaitre la vue et la vue le controller/modele (typage fort)
J'aimerai reproduire ce comportement avec un protocol:
NSBrowser possede deja id<NSBrowserDelegate> delegate (je pense)
La methode "forward" ferait parti d'un protocol complementaire
et le browser passerai par son delegate
Mais bon ca coince (tjrs des warnings)
masquer la property delegate de NSBrowser dans mon BC_Browser
id <BC_BrowserDelegate> delegate;
semble inefficace
Quelle est la BONNE soluce?
ps: c'est un delegate passif.
id <NSBrowserDelegate,BC_BrowserDelegate> delegate;
mmmm
je pensais avoir défini un sur-protocol.
@protocol BC_BrowserDelegate <NSBrowserDelegate>
mais de toute façon cela ne fonctionne pas.
La seule solution actuelle:
declarer un property BC_delegate en // avec la property delegate de NSBrower.
donc plus de sur-protocole mais un protocol simple.
bref....
J'ai enfin isolé le problème:
Et du coup, si je supprime cette ligne, j'ai un bug d'affichage >:(