Contrôle des notifications

muqaddarmuqaddar Administrateur
10:53 modifié dans API AppKit #1
Salut,

Si NSComboBoxSelectionDidChangeNotification est une notification qui nous permet par exemple d'ajouter des observateurs sur une comboBox par le biais de la méthode :

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(recepteurDeChangements:) name:NSComboBoxSelectionDidChangeNotification object:nil];


comment procéder pour des NSMatrix (radio button) et des checkboxes, qui, apparemment n'ont pas de notifications, comme les tableView ou les textFields ?

Réponses

  • 10:53 modifié #2
    Pour les matrix et checkbox, ils faut passer par les target/actions.

    Ceci dit, si ces contrôles agissent sur les préférences, tu peux enregistrer des objets pour les notifications du nsuserdefaults.
  • muqaddarmuqaddar Administrateur
    10:53 modifié #3
    dans 1122891187:

    Pour les matrix et checkbox, ils faut passer par les target/actions.


    Ouais, c'est plus contraignant, surtout avec 80 checkboxes à  associer à  une action...

    Dans mon cas, il ne s'agit point de préférences, mais simplement contrôler que tout un tas de champs de différents types ont changé ou non.

    merci.
  • muqaddarmuqaddar Administrateur
    10:53 modifié #4
    Tant que j'y suis, je ne comprends pas comment je pourrais contrôler que l'objet qui émet la notification a un tag particulier, justement parce que ce contrôle doit avoir lieu avant d'envoyer la notification ?! Et avec cette méthode, je ne vois pas...
  • 10:53 modifié #5
    Si tu relies toutes les actions à  la même méthode et au méme controleur, tu peux récupérer le tag avec [sender tag], et s'il est OK, tu envoies la notification.
  • muqaddarmuqaddar Administrateur
    10:53 modifié #6
    dans 1122893947:

    Si tu relies toutes les actions à  la même méthode et au méme controleur, tu peux récupérer le tag avec [sender tag], et s'il est OK, tu envoies la notification.


    Oui, ça je l'ai déjà  fait, mais ce que je voulais savoir c'est pour le contrôle "automatique" des autres notifications contrôlées par le [NSNotificationCenter defaultCenter]. Par exemple, dès qu'il voit une tableView avec NSTableViewSelectionDidChangeNotification, il va signaler la notif au changement de sélection, moi je voudrais qu'il la signale que si la tableView a un tag égal à  telle valeur.
  • août 2005 modifié #7
    Ben dans ce cas, tu filtres à  l'arrivée, vu que l'objet qui envoie la notification est l'objet de la notification...

    Ou bien si tu as un outlet vers tes tables view, tu peux n'enregistrer un objet que pour les notifications d'une seule table.

    Eddy: Grilled.
  • Eddy58Eddy58 Membre
    août 2005 modifié #8
    Je ne pense pas que ça soit possible, tu es d'abord obligé de recevoir la notification pour ensuite faire la comparaison des tags. Si les tags ne sont pas ceux que tu veux, tu quittes simplement la méthode par un Return. :o

    [EDIT]zut, grilled oui !  :P
  • muqaddarmuqaddar Administrateur
    10:53 modifié #9
    Donc, pour résumer, je dois vérifier les tags dans la méthode "recepteurDeChangements:" en récupérant l'objet notifié, dans mon cas : NSTableViewSelectionDidChangeNotification. C'est cela ?
  • muqaddarmuqaddar Administrateur
    10:53 modifié #10
    Parfait les gars :

    - (void)recepteurDeChangements:(NSNotification *)notification<br />{<br />	NSLog (@&quot;Notification : %d&quot;, [[notification object] tag]);<br />	<br />	_isModified = YES;<br /><br />}
    


    =>
    2005-08-01 15:58:32.586 Vinitheca[3704] Notification : 5
    2005-08-01 15:58:32.588 Vinitheca[3704] Notification : 8
    2005-08-01 15:58:32.597 Vinitheca[3704] Notification : 4
    2005-08-01 15:58:32.599 Vinitheca[3704] Notification : 3
    2005-08-01 15:58:32.599 Vinitheca[3704] Notification : 1
    2005-08-01 15:58:32.600 Vinitheca[3704] Notification : 2

    Merci !
  • DonioDonio Membre
    10:53 modifié #11
    Bonjour,

    ma question est bete peut etre mais je suis debutant dans l'objective c et la derniere fois que j'ai programe c'etait pour VB.

    Alors, mon probleme:

    J'ai monte une petite interface avec des textField's et deux combobox et un petit buton qui calcule des chose fontion de ces combobox. Apres avoir galere un peu pour recuperer la valeur d'une combobox (valeurs numeriques, en passant par indexOfSelectedItem et un switch ) j'ai pu recuperer la valuer tout simplement par:

    maValeurCombo= [[maCombo objectValueOfSelectedItem]intValue]; tout bete mais j'ai mis trois jours pour trouver.

    Maintenant je veux initialiser maCombo avec une valeur que l'utilisateur ne doit forcement modifier. Si j'utilise IB pour definir cette valeur de base le retour va etre errone et pas la valeur que je veux. Cette valeur se trouve sur la troisieme position dans ma combo (les valeurs sont stockes interne et ne vont plus changer).

    J'ai creusé un peu et j'ai trouvé ce code sur le site d'Apple:

    [myComboBox selectItemAtIndex:2]; // First item is at index 0
    [myComboBox setObjectValue:[myComboBox objectValueOfSelectedItem]];

    Ma question est ou j'implement ce code: dans la methode qui gere le bouton ? je dois creer un autre methode qui gere les valeurs par defaut?

    je l'integre dans main.m ou dans maFonction.h ou maFonction.m?


    J'ai pense aussi a utiliser :

    NSComboBoxSelectionDidChangeNotification

    et si celui a ete change je recupere la valeur sinon je la connais deja parcque c'est moi qui la imposé. Mais je ne sais pas comment l'ecrire et ou l'ecrire.
    :why?:
  • CéroceCéroce Membre, Modérateur
    décembre 2008 modifié #12
    D'après ce que je lis, tu ne dois pas utiliser une combo box, mais un bouton pop-up ou pull-down (classe NSPopUpButton). Sous Visual Basic, les boutons pop-up sont effectivement des combo box "non-modifiables"; sous Cocoa, ce sont des objets différents.

    Tu pourras dés lors configurer ton menu directement dans IB, et toujours récupérer l'indice de l'article sélectionné par -indexOfSelectedItem.

    Pour sélectionner l'article par défaut, le plus simple est de le sélectionner sous IB, puis de sauvegarder. Le problème, c'est que le traducteur italien de ton application peut le changer par mégarde.

    Si tu veux utiliser le code donné par Apple, il faut le mettre dans la méthode -(void) awakeFromNib de ton contrôleur. À lire:
    http://www.cocoa.fr/2008/11/19/vos-debuts-en-cocoa/


    P.S.: Il vaut mieux créer un fil de discussion différent quand le sujet n'est exactement le même.
  • DonioDonio Membre
    décembre 2008 modifié #13
    dans 1228827577:


    Si tu veux utiliser le code donné par Apple, il faut le mettre dans la méthode -(void) awakeFromNib de ton contrôleur. À lire:
    http://www.cocoa.fr/2008/11/19/vos-debuts-en-cocoa/

    P.S.: Il vaut mieux créer un fil de discussion différent quand le sujet n'est exactement le même.


    Moi je vois différemment les choses: apple dit que c'est une combobox, elle répond bien comme une combobox et elle est définie bien dans la doc comme une combobox et tu me dis qu'elle n'est pas une combobox? J'ai fais une recherche avant de poster quand même... http://developer.apple.com/documentation/Cocoa/Conceptual/ComboBox/Tasks/SettingComboBoxValue.html

    Mon combo contient: 2,1,0.7,0.5 SI je le sélectionne par default 0.7 , lors du lancement du calcul la valeur : maValeurCombo= [[maCombo objectValueOfSelectedItem]intValue]; retourne une autre valeur à  la conqui n'as pas de sens et je ne sais pas comment elle est trouvé.
    D'ailleurs quand j'impose la valeur par default dans IB , l'IB le considère comme le titre de la combo. Je vais essayer se soir le awakefromnib.

    Mais comment je peux implémenter quand même le: NSComboBoxSelectionDidChangeNotification.

    Merci pour ta reponse.
  • NoNo Membre
    10:53 modifié #14
    dans 1228826403:

    Maintenant je veux initialiser maCombo avec une valeur que l'utilisateur ne doit forcement modifier. Si j'utilise IB pour definir cette valeur de base le retour va etre errone et pas la valeur que je veux. Cette valeur se trouve sur la troisieme position dans ma combo (les valeurs sont stockes interne et ne vont plus changer).
    J'ai creusé un peu et j'ai trouvé ce code sur le site d'Apple:
    [myComboBox selectItemAtIndex:2]; // First item is at index 0
    [myComboBox setObjectValue:[myComboBox objectValueOfSelectedItem]];
    Ma question est ou j'implement ce code: dans la methode qui gere le bouton ? je dois creer un autre methode qui gere les valeurs par defaut?
    je l'integre dans main.m ou dans maFonction.h ou maFonction.m?

    Tu ne nous donnes pas beaucoup de renseignement, malheureusement.

    Traditionnellement, il est facile d'initialiser des éléments d'interface stockés dans un .nib en implémentant la méthode awakeFromNib.
    Mais pour ça, il faut en savoir un peu plus sur ton projet :
    - où est stockée ta combobox ? Dans MainMenu.nib ?
    - dans quelle classe (fichier .h) as tu le IBOutlet id myComboBox; ?
    - si cette classe existe, comment est elle instanciée ? A partir de IB ?
  • CéroceCéroce Membre, Modérateur
    décembre 2008 modifié #15
    Premièrement:

    Je pense que ma réponse était plutôt claire, mais je vais la reformuler:
    - Une combo box a un but précis: permettre de taper n'importe quelle valeur, ou en suggérer une à  l'utilisateur.  -> NSComboBox
    - Quand on veut offrir le choix parmi plusieurs valeurs prédéterminées, on utilise un bouton pop-up (ou bien des boutons radios). -> NSPopUpButton

    Il m'a semblé que ce que tu voulais faire ce rapprochait de ce deuxième choix.


    Deuxièmement:
    Non, on n'utilise pas les notifications pour connaà®tre la valeur d'un contrôle (que ce soit une combo ou un pop-up). Les contrôles envoient des actions lorsqu'ils sont actionnés, comme expliqué dans l'article dont je t'ai donné le lien.

    Troisièmement:
    À ton avis, quelle est la classe de l'objet renvoyé par -[NSComboBox objectValueOfSelectedItem] ? Es-tu sûr que cet objet réponde à  intValue ?

    Essaie plutôt:
    [myComboBox intValue]
  • DonioDonio Membre
    10:53 modifié #16
    Voila mon petit programe:

    #import "Fusebox.h"

    @implementation Fusebox

    - (IBAction) calculer_produit:(id)sender
    {
    float varialble_a, variable_b,produit;
    int  choix_multiplicateur;

    choix_multiplicateur= [[combo_multiplicateur objectValueOfSelectedItem]intValue];  //2,3 ou 1

    produit=variable_a*variable_b*choix_multiplicateur;

    //J'impose le format du produit affiché

    NSNumberFormatter * numeroFormat =[[[NSNumberFormatter alloc] init]autorelease];

    [numeroFormat setFormat:@#,###.00;0.00;(#,##0.00)];
    [[resultat cell] setFormatter:numeroFormat];

    [resultat setFloatValue:produit];

    }
    @end


    Maintenant si je selectionne une valeur du combobox le programme fait ce qu'il doit faire mais si je ne la touche pas (donc je veux utiliser la valeur par defaut) le resultat il est tout con.

    Bon, j'ai trouvé grace a No. Merci No.

    Donc ce que j'ai apris aujourd'hui.:

    - COMBOBOX: An NSComboBox is a kind of NSControl that allows you to either enter text directly (as you would with an NSTextField) or click the attached arrow at the right of the combo box and select from a displayed (“pop-up”) list of items.  ==> c'est une combobox et elle repond bien a : maValeurCombo= [[maCombo objectValueOfSelectedItem]intValue]; si dans la combo sont de valeurs numériques

    -NSComboBox et NSPopUpButton sont deux choses différentes qui donnent "presque" le même résultat

    - - (void)awakeFromNib
    {
    [myComboBox selectItemAtIndex:2]; // First item is at index 0
    [myComboBox setObjectValue:[myComboBox objectValueOfSelectedItem]];
    }
    est utilisé pour initialiser les "variables" qui se trouvent entre les "curly braquets"

    - je ne comprend toujours pas bien le fonctionnement de objective-c et c'est la troisième fois que j'essaye

    Merci Ceroce, NO.


    PS: Je sais Ceroce que tu m'a donne en premier la solution mais j'ai un défaut : je n'arrive as a lire le réponses sarcastiques.
  • CéroceCéroce Membre, Modérateur
    10:53 modifié #17
    Ma réponse n'était pas sarcastique, mais il est vrai que les émotions passent mal sur un forum.

    Ce que tu essaies de faire depuis le début c'est du Cocoa à  la façon du Visual Basic. Tu ne vas pas y arriver (ou alors avec des bidouilles monstrueuses, comme tu es en train de le faire), parce qu'ils fonctionnent très différemment.

    Sous Visual Basic ou Visual C++, pour répondre à  un clic sur un bouton, tu crées un objet qui hérite de la classe bouton, et tu modifies sa méthode mouseClicked.
    Sous Cocoa, la classe NSButton possède une variable d'instance target, représentant sa cible, et fait un appel de méthode à  cette cible.

    Encore une fois, je te conseille fortement de lire l'article que je t'ai mis en lien.
  • NseaProtectorNseaProtector Membre
    10:53 modifié #18
    Je confirme ce que dis Céroce, j'ai utilisé pas mal de temps VB6 et je dois dire qu'approcher Cocoa derrière n'est pas chose aisé. Je pense qu'il faut persévérer et essayer encore et encore... Le concept n'est pas du tout le même, parcontre ce qui est encourageant c'est la puissance que l'on sent sous le capot, ça n'a rien a voir... L'homme a cette qualité de s'adapter, il lui faut juste du temps. Courage et l'on sera tous des bêtes en cocoa.
  • DonioDonio Membre
    10:53 modifié #19
    Bon ,

    je pense que je vais ouvrir un post pour le debutants. Merci de me rejoindre.
  • schlumschlum Membre
    10:53 modifié #20
    Lire " Cocoa par la pratique ", ça peut faire du bien aussi... Surtout qu'il y a une toute nouvelle édition qui vient de sortir.
  • DonioDonio Membre
    10:53 modifié #21
    dans 1228919764:

    Lire " Cocoa par la pratique ", ça peut faire du bien aussi... Surtout qu'il y a une toute nouvelle édition qui vient de sortir.


    Merci, j'en ai la version en anglais depuis un moment mais...et j'en ai une pour "les nuls" elle est un peu vieille mais c'est avec elle que j'ai reussi a comprendre des choses.

    J'aurai une question quand meme: pour faire simple , mais simple comme pour expliquer au cons:

    comment decrirai toi le fonctionnement de objective-c? et avec quoi tu remplacerai les mots instance, methode, instancier. 

    meme cette question je la trouve bete et je ne suis pas convencu que c'est ce que je veux demander.  :'( :'( :'( :'( :'( :'( :crackboom:- :crackboom:-

    [size=6pt](j'ai honte de poster ça, mais bon)[/size]
  • AliGatorAliGator Membre, Modérateur
    10:53 modifié #22
    Prennons par l'exemple : quand on parle de "voitures" on sait que les voitures ont 4 roues, un volant, qu'elles peuvent démarrer, avancer, reculer, tourner à  gauche et tourner à  droite.

    "Voiture" c'est la classe, c'est le terme générique pour désigner tous les objets de ce type, et le décrire c'est à  dire décrire :
    - de quoi il est composé et ce qui le définit (roues, volant, une couleur, une immatriculation) = les variables d'instance de ta classe
    - ce qu'il sait faire (démarrer, avancer, reculer, ...), les actions qu'il sait réaliser = les méthodes de ta classe

    Après il existe plein de voiture, y'a la voiture à  Paul, celle à  Jean et celle à  Sophie.
    Chacune de ces voitures est une instance unique. On parle de "La voiture de Jean" pour désigner cette voiture explicitement.
    D'ailleurs, la voiture de Paul pourra être bleue et immatriculée "1234 CC 35" et celle de Sophie être verte et immatriculée "5678 SP 28" : chaque instance de la classe Voiture a les mêmes variables d'instance (couleur, immatriculation, ...) mais ces variables peuvent avoir des valeurs différentes (couleur = bleu pour l'une, vert pour l'autre ...) pour chacun instance


    Une classe est donc une sorte de "modèle générique" qui décrit comment est fait un objet de ce type, de quoi il est composé, ce qui définit l'objet et les actions qu'il peut réaliser (les méthodes), et ensuite tu peux avoir plusieurs instances de cette classe, donc plusieurs objets qui sont de ce type.
    Si dans ton programme tu as 3 Voitures et 2 Assiettes, Voiture et Assiette sont des classes dont tu as 3 instances pour l'une et 2 pour l'autre. Tu as donc à  un moment instancié 3 Voitures, c'est à  dire créé 3 objets de type Voiture (dont la classe est Voiture).

    Voilà  j'espère que c'est plus clair :)
Connectez-vous ou Inscrivez-vous pour répondre.