Question sur la Gestion du NSPopUpButton

Bonsoir,


J'ai un petit souci pour utiliser mes PopUPButton, pourriez-vous m'aiguiller.


En fait, je dois alimenter des popubuttons avec une liste de valeurs et ensuite je dois cumuler toutes les valeurs sélectionnées dans chaque Popupbutton pour les mettre dans un fichier.


J'ai du mal à  comprendre la chose.


:'(


A+ 


Réponses

  • Tu ajoutes des items via addItemWithTitle par exemple... Les titles sont des NSString, donc tu mets ce que tu veux dedans.


    Si tu dois accrocher un entier (par exemple) à  ton item, il faut utiliser le tag des NSMenuItem qui composent le menu du popUp.


     


    Après je comprends pas très bien ce que tu demandes, mais tu accèdes à  l'item sélectionné via selectedItem qui est (souvent) un NSMenuItem, dont tu peux lire les titletag, etc.


  • CéroceCéroce Membre, Modérateur
    ça fait longtemps, alors j'ai dû me replonger dans la doc.

    En fait, ce n'est pas très compliqué, il suffit de créer les NSPopupButtons (ou de tirer des outlets) et d'appeler addItems(withTitles:).
    Ensuite, consulte .indexOfSelectedItem pour savoir quel article est sélectionné.

    On peut tout faire dans un XIB/Storyboard si les articles sont toujours les mêmes.
  • PatyomPatyom Membre
    décembre 2017 modifié #4

    Merci à  vous deux,


     


    J'ai pas mal avancé sur le sujet et effectivement je vais dans le chemin que vous me donnez.


     


    Une question : peut-on remplir le PopUpButton au moment où l'on clique dessus ?


     


    j'arrive à  le faire quand je relâche la souris après mon choix mais c'est trop tard je suis obligé de reclouer pour avoir la liste.


     


    Pas terrible ! ;)  ;)


  • CéroceCéroce Membre, Modérateur

    Une question : peut-on remplir le PopUpButton au moment où l'on clique dessus ?

    J'en doute (pour des histoires de runloops), mais pourquoi voudrais-tu faire cela ?
  • klogklog Membre
    décembre 2017 modifié #6

    Alors de mémoire (et à  vérifier), tu peux créer une classe qui hérite de NSPopUpButton et tu surcharge la fonction mouseDown :



    - (void)mouseDown:(NSEvent *)theEvent
    {
      // ici ton code pour remplir le popUp

      [super mouseDown:theEvent];
    }

    Il ne faut pas oublier d'appeler [super mouseDown] en fin de fonction parce que c'est là  que la boucle de gestion du clic sur le bouton est lancée.


  • en Swift comment se programme la ligne :



     


     


    [super mouseDown:theEvent];
  • Sorry,


    J'ai la réponse : 



    super.mouseDown(with: event)
  • ha ouai, désolé... Swift, c'est pas trop mon truc :o  


    J'attends la compatibilité avec C/C++ pour y passer... Peut-être jamais... 




  • J'en doute (pour des histoires de runloops), mais pourquoi voudrais-tu faire cela ?




    Oui pourquoi parce que je ne vois pas ce qui t'empêche de remplir le menu avant le clic.

  • Pour des raisons qui seraient un peu longue à  expliquer, il faut que je remplisse au moment du clic.


     


    Bon, je suis arrivé à  le faire mais maintenant je me heurte une fois de plus aux chaines des caractères, quelle poisse.


     


    Je m'explique : 


    les chiffres que je stocke dans mes PopUpButton doivent être des Strings de ce type "8356,3", avec 1 chiffre après la virgule.


    Au départ, avant de créer la liste, mon chiffre peut-être comme suit,


    "8356",       "8356,3",    "8356,35" 


    et après traitement :


    "8356,0",    "8356,3",    "8356,3"


    Je me suis embarqué dans un truc, je suis perdu


    mon code 



    class ViewController: NSViewController {

    override func viewDidLoad() {
    super.viewDidLoad()

    // Do any additional setup after loading the view.
    let coteDef: String? = "13.535,15"
    var coteD: String?
    coteD = transformationString(coteF: coteDef!)
    print(coteD)
    }

    override var representedObject: Any? {
    didSet {
    // Update the view, if already loaded.
    }
    }

    func transformationString(coteF: String) -> String {
    var findLength: String = coteF
    findLength = findLength.replacingOccurrences(of: ".", with: "")
    findLength = findLength.replacingOccurrences(of: ",", with: ".")
    print("findLength : \(findLength)")
    var cote = Double(findLength)! * 100

    var coteString = String(Int(cote))
    let res = coteString.utf16.prefix(coteString.characters.count - 1)
    print("res : \(res)")
    let cote2 = Double(res) / 10
    // Là , ça coince (Double(res) / 10)
    cote2 = cote2.replacingOccurrences(of: ".", with: ",")
    // Là  aussi parce que cote2 n'est pas un String
    return cote2
    }
    }

     

     


     


  • klogklog Membre
    décembre 2017 modifié #12

    Pas certain de comprendre la question : est-ce que tu connais le chiffre ou n'est-il présent, déjà  formaté, que dans la chaine ?


     


    Si tu connais le chiffre, tu peux utiliser le formatage intégré à  NSString :



    [NSString stringWithFormat:@%.1f, tonChiffre]

    qui impose un chiffre après la virgule.


     


    Sinon tu peux utiliser un NSNumberFormatter, qui te permettra plus de souplesse (notamment de remplacer le point par la virgule, etc.).


  • klogklog Membre
    décembre 2017 modifié #13

    Si ce chiffre n'est présent que dans le titre des items de ton popUp, ne peux-tu les stocker dans un tableau en //, et utiliser l'index de l'item ou son tag pour y accéder ? Recomposer une chaine en partant des valeurs des chiffres sera sans doute plus simple (et logique en ne stockant pas d'information dans une vue et donc en respectant le paradigme MVC). 


  • CéroceCéroce Membre, Modérateur
    décembre 2017 modifié #14

    À essayer mais dans Interface Builder, tu dois pouvoir glisser un NSNumberFormatter sur ton NSPopUpButton.


    NSPopUpButtonCell hérite de NSCell qui a une propriété .formatter.


  • Joanna CarterJoanna Carter Membre, Modérateur
    décembre 2017 modifié #15


     


    Pour des raisons qui seraient un peu longue à  expliquer, il faut que je remplisse au moment du clic.


     


    Bon, je suis arrivé à  le faire mais maintenant je me heurte une fois de plus aux chaines des caractères, quelle poisse.


     


    Je m'explique : 


    les chiffres que je stocke dans mes PopUpButton doivent être des Strings de ce type "8356,3", avec 1 chiffre après la virgule.


    Au départ, avant de créer la liste, mon chiffre peut-être comme suit,


    "8356",       "8356,3",    "8356,35" 


    et après traitement :


    "8356,0",    "8356,3",    "8356,3"




     


    Tout d'abord, ne stock pas les valeurs numériques en String !


     


    Dans to exemple tu as déjà  fait un bêtise en transformant "8356,35" en "8356,3". Normalement, l'arrondissage des chiffres qui se termine en 5 ou plus devrait passer au prochain chiffre - "8356,35" en "8356,4"


     


    Si tu as stocké les valeurs en Double, tu n'aurais pas ce type de problème.


     


    Le NSPopupButton n'est pas la pour stocker les valeurs, seulement pour les afficher, les transformant si nécessaire.


     


    Pour être notifier avant le popup, il faut capter la notification :



    extension NSPopUpButton
    {
    public class let willPopUpNotification: NSNotification.Name
    }

    ... et faire le remplissage dans la méthode qui la capte.


  • Joanna CarterJoanna Carter Membre, Modérateur

    Code exemple :



    public class ViewController: NSViewController
    {
    @IBOutlet weak var popup: NSPopUpButton!

    var valeurs = [123.45, 234.0, 345.6, 456.0]

    @objc func remplirPopup(notification: Notification)
    {
    popup.removeAllItems()

    let titles = valeurs.map
    {
    valeur in

    return String(format: "%0.01f", valeur)
    }

    popup.addItems(withTitles: titles)
    }

    override public func viewDidLoad()
    {
    super.viewDidLoad()

    NotificationCenter.default.addObserver(self, selector: #selector(remplirPopup(notification:)), name: NSPopUpButton.willPopUpNotification, object: nil)
    }
    }
  • PatyomPatyom Membre
    décembre 2017 modifié #17

    C'est trop compliqué pour moi, je plane !


    c'est peut-être pas ma journée

  • Joanna CarterJoanna Carter Membre, Modérateur

    Oui, c'est compliqué mais c'est plus correcte d'utiliser les bindings pour le remplir.


Connectez-vous ou Inscrivez-vous pour répondre.