NSArrayController's "imbriqués"

AdauAdau Membre
septembre 2011 modifié dans API AppKit #1
Coucou,

Désolé pour le titre tordu, mais je n'ai pas trouvé mieux  :(
Bref, imaginons que mon programme possède pleins d'options (button radios, checkbox etc...) et que l'utilisateur veuille sauvegarder ces options pour en faire des presets.

Jusque là  tout va bien, un petit NSArrayController (pour lister les presets), des bindings qui faut où il faut et c'est fini.

Mais dans les options se trouve une liste d'éléments (au hasard un liste de nom de musique avec leur artiste respectif), que j'aimerai aussi sauvegarder dans le preset. Et là  je n'ai pas trop d'idée.

J'ai essayé de créer 2 NSMutableArray dans la classe "preset" puis binder les colonnes du tableau sur les Arrays via le contrôleur que j'utilise. Ca a l'air de marcher, mais je ne maitrise pas l'ordre des lignes que présentent chaque colonne, et c'est très loin d'être "clean".

Donc j'aimerai passer par un autre NSArrayController, mais là  je coince.  ???

En gros, comment feriez-vous un programme qui présente les boutons :
- addPreset:
- addMusic:

Merci pour votre aide !  :)

Réponses

  • laudemalaudema Membre
    11:14 modifié #2
    Bonjour,
    Il me semble que je créerais une petite Class Morceau contenant presset et music, c'est un tableau "Morceaux" de ces objets que je lierais au ArrayController. De cette manière avec un bouton relié à  l'action "Add" du Controller il s' ajouterait un de ces objets à  chaque appui sur le bouton, initialisé aux valeurs que tu as mis (ou pas) dans la méthode init de la classe.
    Ou un NSMutableArray "Morceaux" de dictionnaires avec les clefs preset et music et dans ce cas le bouton add ne pointerait pas vers le ArrayController mais vers la WindowConntrolller de la fenêtre (ou l'objet qui contient le NSMutableArray de toutes façons). Avec une IBAction qui ajouterait un nouveau dictionnaire au NSMutableArray en utilisant les méthodes KVO
    - (void)insertObject:(NSDictionary*)dict inMoreauxAtIndex:index;<br />-(void)removeObjectFromMorceauxAtIndex:index;
    
    pour que ça soit répercuté dans l'interface.
    As tu lu ce passage de la documentation ?
  • AdauAdau Membre
    11:14 modifié #3
    Merci pour ta réponse.

    J'ai bien peur, au vu de ta réponse, que je me sois mal exprimé.
    J'ai des réglages (checkbox, radio) dont un réglage est une liste.
    Et je veux que l'on puisse switcher vite d'un groupe de réglages à  l'autre.

    Prenons l'exemple d'un backup via rsync (plus parlant que les musiques/artistes) :
    Je veux sauvegarder 2 dossiers avec un réglages précis (sauvegarde unidirectionnel par exemple) et 3 autres avec un autre réglage (une synchro).
    J'ai donc deux presets, chacun des presets contient une liste de dossier à  sauvegarder (avec leur destination).

    Pour l'instant, l'utilisateur ajoute/supprime/edite les presets (checkbox et radio) sans problèmes. Mais je veux qu'il puisse éditer une liste de dossier (par preset).

    Donc j'ai envie de remettre un NSArrayController (parceque c'est pratique et que ça fait tout le boulot, et pour éviter le code horrible de ma solution qui marche), mais je n'y arrive pas, je bloque pour inclure la liste de dossier dans mes presets.

    Voici un exemple d'interface (qui reprend l'exemple des musiques).

    Je vous envoie un beau projet xcode ce soir !

    Merci
  • CéroceCéroce Membre, Modérateur
    11:14 modifié #4
    En reprenant ton exemple:

    La colonne de la table de gauche est bindée ainsi:
    contentArray = presetsArrayController.arrangedArray.name

    Les réglages affichent l'état de la sélection de presetsArrayController. Ainsi la première checkbox est bindée sur:
    value = presetsArrayController.selection.booleen0

    De la même manière, la table de droite affiche les titres liés à  la sélection de presetsArrayController. Il faut utiliser un deuxième NSArrayController, bindé sur presetsArrayController.selection.musics

    Ensuite, tu pourras binder les colonnes de la table de droite sur musicsArrayController.


    (Mes explications ne sont pas très claires, mais c'est parce que tu ne nous a pas fourni la structure du modèle de données, donc nous n'avons pas de langage commun).
  • AdauAdau Membre
    11:14 modifié #5
    Oh si ! Tes explications sont très claires !
    Je créais effectivement un deuxième NSArrayController, mais il était mal bindé (ou sa class name était mal définie).

    Dans l'exemple, musics (de presetsArrayController.selection.musics) est un objet contenant deux NSString ?

    Promis ce soir je vous balance le projet xcode... Mais je crois que ça va marcher :)

    Merci
  • CéroceCéroce Membre, Modérateur
    11:14 modifié #6
    dans 1315396153:

    Dans l'exemple, musics (de presetsArrayController.selection.musics) est un objet contenant deux NSString ?

    Non, c'est un NSMutableArray contenant des Music qui contiennent deux NSString.
    (Un NSArrayController se binde sur un NSArray, préférablement Mutable). (ou peut-être aussi sur un NSSet, mais je ne suis plus sûr).
  • AdauAdau Membre
    11:14 modifié #7
    Aà¯e Aà¯e !

    Je n'y arrive toujours pas  :(
    J'ai mis en PJ mon programme. Les options marchent bien (changez les réglages pour plusieurs presets, vous verrez bien). Mais rien ne se passe pour les dossiers.

    Evidemment, je vois bien qu'il manque un lien, ou un attribut quelque part, mais je vois ni quoi ni où  ???

    Hop ! Tomate pour moi :  :o
  • CéroceCéroce Membre, Modérateur
    11:14 modifié #8
    Le Modèle ne va pas s'instancier tout seul.  >:)

    Commence par créer le NSMutableArray qui stocke les presets, et binde presetsArrayController.contentArray dessus.
    De même, il faut instancier le NSMutableArray copyList (qui devrait plutôt s'appeler folders), et binder foldersArrayController sur presetsArrayController.selection.copyList.
  • AdauAdau Membre
    11:14 modifié #9
    Ok merci !

    J'ai réussi à  m'en sortir grâce à  toi.
    Cf PJ !
Connectez-vous ou Inscrivez-vous pour répondre.