NSTextField et son delegate

gibet_bgibet_b Membre
04:55 modifié dans API AppKit #1
Salut à  tous,

J'ai voulu implèmenter une méthode delegate dans mon PreferenceController pour qu'il active un bouton si et seulement si il y avait une lettre dans un NSTextField.

J'ai donc mis dans mon PreferenceController.h :
// Méthodes delegate<br />- (void)textDidChange:(NSNotification *)aNotification;


Et dans mon PreferenceController.m :
// Méthode delegate pour l&#39;activation du bouton Add<br />- (void)textDidChange:(NSNotification *)aNotification<br />{<br />	[addButton setEnabled:[[nameCategoryField stringValue] isNotEqualTo:@&quot;&quot;]];<br />	NSLog(@&quot;delegate&quot;);<br />}


Et dans Interface Builder, j'ai activé le delegate pour le NSTextField sur le File's Owner (PreferenceController).

Mais lorsque je tape dans mon textfield, rien, il semble ne pas passer dans textDidChange  :-\\

Je sens l'erreur de débutant mais pourtant j'ai vérifié par rapport à  ce qui est dit dans "Cocoa par la pratique"  ::)

Réponses

  • AliGatorAliGator Membre, Modérateur
    04:55 modifié #2
    textDidChange:
    Posts a notification that the text has changed and forwards this message to the receiver's cell if it responds.

    [tt]- (void)textDidChange:(NSNotification *)aNotification[/tt]

    Parameters
    aNotification
        The [tt]NSControlTextDidChangeNotification[/tt] notification that is posted to the default notification center.

    Discussion
        This method causes the receiver's delegate to receive a [tt]controlTextDidChange:[/tt] message. See the NSControl class specification for more information on the text delegate method.
    Donc ça me parait bizarre, mais ne serait-ce pas "controlTextDidChange" plutôt la méthode reçue ?

    Je dis ça à  tout hasard, hein, parce que pourtant j'avais compris comme toi que c'était [tt]textDidChange:[/tt] la méthode de delegate, mais vu qu'elle n'est pas appelée et surtout en relisant ce qui est mis dans la doc, j'ai un gros doute...

    La doc dit que cette méthode ne fait que poster la notification et que le message envoyé au délégué est bien [tt]controlTextDidChange[/tt] donc tu n'as plus qu'à  essayer avec celle là  :)


    Ah au fait sinon au passage : pour une méthode de delegate, tu n'as pas à  la déclarer dans le .h (c'est comme le awakeFromNib, tu n'écris pas son prototype dans le .h non plus, tu ne fais que surcharger...)
  • gibet_bgibet_b Membre
    04:55 modifié #3
    Merci beaucoup AliGator (au fait, ton pseudo, c'est que tu es un nostalgique d'Amstrad ?  ;) ), tu avais tout à  fait raison ! Ce qui me rassure, c'est que je ne suis pas le seul à  qui cela parait confusant...

    Et merci pour ce que tu m'as dit en ce qui concerne le .h  ça me paraissait bizarre mais dans "Cocoa par la pratique", il déclare la méthode delegate dans le .h  B)
  • Eddy58Eddy58 Membre
    juin 2006 modifié #4
    Il n'y a rien de bizarre, seulement il faut bien faire la différence entre delegates et notifications. Soit on prend l'un, soit on prend l'autre. :o

    -Si on décide d'utiliser la méthode delegate, il faut en effet mettre son contrôleur comme receveur du message controlTextDidChange. Le contrôleur sera alors automatiquement déclaré pour recevoir la notification.
    [tt]
    -(void)controlTextDidChange:(NSNotification *)notification
    {
    }
    [/tt]

    -Si on décide d'utiliser les notifications, il faut alors déclarer son contrôleur au centre de notification. Cette méthode a pour avantage de choisir le nom de la méthode que l'on veut, mais surtout de définir quel objet sera surveillé. Alors que pour la méthode delegate, il va falloir aller chercher dans le userInfo de la notification pour savoir quel objet est concerné si on a besoin de différencier tel ou tel objet.
    [tt]
    -(void)dealloc
    {
    [[NSNotificationCenter defaultCenter] removeObserver:self];
    }

    -(void)awakeFromNib
    {
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(monTextFieldChange:) name:NSControlTextDidChangeNotification object:monTextField];
    }

    -(void)monTextFieldChange:(NSNotification *)notification
    {
    }
    [/tt]

    -Sinon, pour le fait de déclarer ou pas les méthodes surchargées, perso je les déclare toutes, car cela permet de voir d'un coup d'oeil toutes les méthodes implémentées en lisant le fichier d'interfaçage, sans aller perdre du temps dans le fichier d'implémentation. C'est d'ailleurs, je pense, l'optique du bouquin "Cocoa par la pratique" aussi.  :)
  • AliGatorAliGator Membre, Modérateur
    juin 2006 modifié #5
    Ah ben oui que je suis bête en plus j'y ai pensé à  cette différence.
    Tu as mis le point dessus, merci pour ces éclaircissements ;)

    Par contre, ne pas oublier le [tt][super dealloc][/tt] quand on surcharge la méthode [tt]dealloc[/tt] !!
    (d'ailleurs j'ai remarqué que si on l'oublie, il nous met un warning pour nous signaler l'oubli, enfin du moins avec mes réglages depuis que j'Xcode sur mon iMac Intel j'ai eu ce warning suite à  cet oubli... sais pas si c'est la config par défaut mais c'est tant mieux :))






    PS pour Gibet_b : Oui l'avatar vient du fameux logo Amstrad, mais l'histoire de l'avatar elle ne vient pas de là  (mon surnom vient de plusieurs choses à  la fois, l'une d'elle et la plus courte à  expliquer étant la consonnance de mon nom de famille :) Et le fait qu'il n'y ait qu'un seul "L" à  mon pseudo (alors que l'animal homonyme en a 2) a aussi son histoire...). C'est suite à  mon surnom que j'ai pris le croco d'Amstrad pour avatar et non l'inverse, mais l'idée me plaisait bien aussi :)

    D'ailleurs ce soir dès que je rentre je met la version vectorisée dudit avatar (fait par un pote très doué en retouches et manip photoshop même s'il se refuse à  l'admettre :D) à  la place de ce pixellisé qui semble tout moche à  côté :)

    [EDIT]Ayé, me suis refait une beauté :)[/EDIT]
Connectez-vous ou Inscrivez-vous pour répondre.