Plusieurs Notifications pour un même delegate

chaps31chaps31 Membre
10:45 modifié dans API AppKit #1
Toujours actif dans Xcode aujourd'hui...  ;)

J'ai un problème simple, lorsqu'une combobox change je veux qu'elle envoie une notifiaction à  une classe que j'ai créé pour l'exécution de diverses actions, impec "- (void)comboBoxSelectionDidChange:(NSNotification *)notification" est fait pour ça, c'est très simple, ça marche très bien.

Le hic c'est que cette classe va recevoir la même notification (DidChange) de combobox différentes, avec des réactions différentes, comment les différencier ??? J'ai épluché le net un bouquin, AppKido pas de solution... La notification en question à  une variable "userInfo" null, je comptais utiliser la variable "object" de la notification:
if [[notification object] isEqualTo: Combobox1]{....


sauf que si Combobox1 est le nom de mon IBOutlet  ça ne marche pas car isEqualTo dans ce cas là  compare les adresses mémoires... Comment faire ??? Merci.

Réponses

  • chaps31chaps31 Membre
    10:45 modifié #2
    Question - réponse :

    Les tag de l'objet sont atteingnable : [[notification objet]tag]

    Et le tour est joué, désolé pour le dérangement... ::)
  • NoNo Membre
    10:45 modifié #3
    [notification objet] te renvoie l'adresse de la combo qui a déclenchée la notification. L'adresse, c'est l'IBOutlet.
    Donc tu peux aussi faire :
    <br />IBOutlet id maCombo1;<br />IBOutlet id maCombo2;<br /><br />[...]<br /><br />if ([notification objet]==maCombo1)<br />{<br />&nbsp; &nbsp; // notification suite à  action sur combo 1<br />}<br />else if ([notification objet]==maCombo2)<br />{<br />&nbsp; &nbsp; // notification suite à  action sur combo 2<br />}<br />
    

  • chaps31chaps31 Membre
    10:45 modifié #4
    Non, ça ne marche pas, j'avais essayé. Je ne sais pas exactement comment sont gérés les iboutlet, mais l'iboutlet et l'objet du fichier nib correspondent à  mon avis à  2 adresses mémoires distinctes et le "==" doit comme is EqualTo les comparer, du moins j'imagine.
  • NoNo Membre
    10:45 modifié #5
    dans 1229807985:

    Non, ça ne marche pas, j'avais essayé. Je ne sais pas exactement comment sont gérés les iboutlet, mais l'iboutlet et l'objet du fichier nib correspondent à  mon avis à  2 adresses mémoires distinctes et le "==" doit comme is EqualTo les comparer, du moins j'imagine.

    Si ça marche.
    C'est ton code qui est foireux.

    L'IBOutlet c'est l'adresse de l'objet instancié par IB.
    C'est aussi ce que renvoie la méthode object de NSNotification.
    Un même objet (ta combo) ne peut pas avoir 2 adresses différentes, du moins dans notre réalité.

    == est simplement l'opérateur C de comparaison. Ici on compare 2 adresses mémoire.

  • AntilogAntilog Membre
    10:45 modifié #6
    Je confirme !

    Un test entre [notification object] et l'outlet correspondant est tout à  fait possible! Et heureusement!
  • chaps31chaps31 Membre
    10:45 modifié #7
    bizarre ça, mais comme j'ai un soucis sur un NSTextField (enfin "version" mot de passe) qui ne semble pas liée à  mon IBOutlet, en effet il y a peut-être un soucis, un truc peut m'échapper dans les liens entre IB et iboutlet.
    Ceci dit avec les tag ça marche, si un truc vous saute aux yeux dans ce que je viens de dire surtout n'hésitez pas car j'ai un NSTextField qui ne réagi pas à  mon code malgré le lien avec un IBOutlet... Je deviens fou là ...  :crackboom:-
    Je passe sans doute à  coté de quelque chose...
  • NoNo Membre
    10:45 modifié #8
    Concernant les NSTextField, il y a en effet une petite particularité :
    - en affichage seul, le NSTextField est un... NSTextField.
    - en édition active (curseur dedans), le NSTextField s'efface pour laisser place à  un NSText (objet dont le rôle est l'édition de texte).

    Dans des cas particuliers, une notification semblant émanée d'un NSTextField en cours d'édition peut en fait avoir pour origine le NSText attaché (donc l'outlet pointant sur le textField est différent du object de la notification qui vient de NSText).

    Mais détecter ce type de comportement montre peut être un code mal fait (car dans la majeure partie des cas, le programme n'a pas à  se soucier de ce que fait NSText).
  • AliGatorAliGator Membre, Modérateur
    10:45 modifié #9
    Certes mais normalement comme tu le dis No tout ceci est transparent... en l'occurence le "object" de la notiication dans ce cas est bien normalement le NSTextField, qui a bien forcément la même adresse mémoire que tout IBOutlet qui pointe dessus. Le NSText qui sert pour l'édition de ce NSTextField quant à  lui est accessible dans la clé @NSFieldEditor du userInfo dictionary.
    Tout comme indiqué ici d'ailleurs.

    Donc ça ne devrait pas venir de là ...
    Ce qui est d'autant plus étonnant c'est que si la comparaison avec le "tag" fonctionne, c'est que c'est le bon objet. Y'a un souci sur l'IBOutlet que tu compares avec [tt][notification object][/tt] je vois rien d'autre.
    Faudrait mettre des NSLogs dans ta méthode de notification pour afficher la valeur à  la fois de ton IBOutlet et de [tt][notification object][/tt], ainsi que leurs className, tag, etc... histoire de mieux comprendre ;)
  • chaps31chaps31 Membre
    10:45 modifié #10
    Grande règle du codeur amateur qui apprend sur le tas quand tu bloques sur un bug, arrête de coder va voir le soleil dehors et reviens plus tard. Ce matin je reprend mon code et je vois sur mon IBoulet NSTextField un alloc-init... "ben qu'est-ce que ça fout là ", je le vire et il répond sans problème mon NSTextField...  ::)

    Pour le NSCombobox et la notification, heu ho... un alloc-init  :o   qu'est-ce qu'il fout là  ? Je le vire et le == marche très bien entre mon IBoutlet et la variable object de notification. Bon en fin de compte je préfère utiliser les tag avec un switch je trouve ça plus... propre.... je préfère.

    Autre règle du programmeur amateur : jamais plus de 2 heures de code d'affilé...

    Merci à  tous d'être toujours aussi présent et patient, si je croise un de vous dans ma belle ville de Toulouse faudra que je lui paie un coup...

    PS : mon code était bien "foireux"... :P
  • Philippe49Philippe49 Membre
    décembre 2008 modifié #11
    dans 1229857036:

    ... Ce matin je reprend mon code et je vois sur mon IBoulet NSTextField un alloc-init...


    Oui, il ne faut pas confondre IBOutlet et .. IB Boulet !  :) :) ;D

    PS : Si tu nous invites à  Toulouse, on y va tous, prépare le cassoulet .  :p :p
  • chaps31chaps31 Membre
    10:45 modifié #12
    Salut Philippe49 je vois que dès que l'on parle de Chianti, de boire un coup, de cassoulet et autres joyeusetés culinaires, hophop tu es là  
    Philippe49=[[P&#39;titebouffeBonVin alloc] init];
    
        ;)
  • 10:45 modifié #13
    Toulouse toulouse ??? Ouaip venez j'habite là  bas aussi :D
Connectez-vous ou Inscrivez-vous pour répondre.