categorie de protocol

cyranocyrano Membre
bonjour,

je n'arrive pas a implementer une categorie de protocol  :( c'est possible?

@protocol NSBrowserDelegate (navigation) genere une erreur

Réponses

  • CéroceCéroce Membre, Modérateur
    novembre 2010 modifié #2
    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.
  • cyranocyrano Membre
    00:52 modifié #3

    Si tu crées une sous-classe de NSBrowser (mauvais idée):


    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.


    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.


    je vais regardé cela
  • mpergandmpergand Membre
    00:52 modifié #4
    Dans une sous classe de NSBrowser, j'ai un protocole et il est même pas public ...
    <br />//<br />//&nbsp; CSBrowser.m<br />//<br /><br /><br />#import &quot;CSBrowser.h&quot;<br />#import &quot;CSBrowserCell.h&quot;<br /><br />// méthodes déléguées<br />#define Method_TextDidEndEditing(a,b,c) browser:a didEndEditing:b forCell:c<br />#define Selector_TextDidEndEditing Method_TextDidEndEditing(,,)<br /><br />@protocol CSBrowserDelegate<br /><br />-(void) Method_TextDidEndEditing((id)sender,(NSString*)text,(id)cell);<br /><br />@end<br /><br /><br />....<br /><br />// field editor delegate	<br /><br />- (void)textDidEndEditing:(NSNotification *)note<br />{<br />	// appel de la méthode deléguée<br />	if([[self delegate] respondsToSelector:@selector(Selector_TextDidEndEditing)])<br />		[(&lt;CSBrowserDelegate&gt;)[self delegate] Method_TextDidEndEditing(self,[[note object] string],oEditedCell)];<br /><br />	[self _endEditing];<br />}<br /><br />
    


    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)

  • tabliertablier Membre
    00:52 modifié #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)
  • mpergandmpergand Membre
    novembre 2010 modifié #6
    dans 1291043214:

    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  >:(
  • cyranocyrano Membre
    novembre 2010 modifié #7
    **tain de protocol.

    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

    <br /><br />@protocol BC_BrowserDelegate &lt;NSBrowserDelegate&gt;<br /><br />- (BOOL)browserForward:(NSBrowser *)sender;<br /><br />@end<br /><br />
    


    et le browser passerai par son delegate

    <br />[[self delegate] browserForward:self];<br />
    



    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.
  • mpergandmpergand Membre
    00:52 modifié #8
    Il faut spécifier les deux protocoles:
    id <NSBrowserDelegate,BC_BrowserDelegate> delegate;
  • cyranocyrano Membre
    00:52 modifié #9
    dans 1291053435:

    Il faut spécifier les deux protocoles:
    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....
  • mpergandmpergand Membre
    décembre 2010 modifié #10
    dans 1291043214:

    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&lt;[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];&nbsp; // 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  >:(
Connectez-vous ou Inscrivez-vous pour répondre.