1

Dire que j'ai le tableau suivant des dictionnaires:Reliure deux voies modèle--clés différents à la même sélection NSArrayController

{ 
    { 
     isoName => en, 
     fullName => English, 
     localName => English 
    }, 
    { 
     isoName => de, 
     fullName => German, 
     localName => Deutsch 
    }, 
    { 
     isoName => fr, 
     fullName => French, 
     localName => français 
    } 
} 

Comment puis-je lier les valeurs fullName aux valeurs d'un contrôle NSPopUpButton mais lier la sélection de isoName à NSUserDefaults? J'ai un NSArrayController mis en place avec un tableau comme ci-dessus, et mon NSPopUpButton est lié à ce contrôleur avec le chemin clé de modèle comme "fullName", mais je veux garder le isoName dans le NSUserDefaults. Est-ce possible? Y a-t-il une meilleure façon d'aborder cela?

Répondre

1

Tout d'abord, créez une classe d'objet modèle représentant une langue et attribuez à ces paires de propriétés de dictionnaire les propriétés du modèle. Les dictionnaires ne fonctionnent pas bien avec les liaisons, d'après mon expérience; le système Bindings veut des objets de modèle réels.

Ensuite, créez un objet contrôleur pour contenir ces objets de modèle. Je l'appellerai LanguageKeeper. Il a trois propriétés:

  • languages (NSArray objets langage)
  • selectedLanguage
  • selectedLanguageISOName

Expose le dernier comme une liaison. Aussi, faites l'une des deux dernières propriétés dérivées de l'autre. Je ferais la dérivée de la propriété ISOName: le getter renverra self.selectedLanguage.ISOName, et setter effectuera la recherche pour un nom ISO donné et définira self.selectedLanguage à cet objet de langage. Assurez-vous de mettre en œuvre keyPathsForValuesAffectingSelectedLanguage et keyPathsForValuesAffectingSelectedLanguageISOName, et d'avoir le nom de l'autre propriété dans l'ensemble que chaque méthode renvoie.

Commencez par lier la liaison de tableau de contenu de NSArrayController à la propriété languages du LanguageKeeper.

Ensuite, lier trois propriétés sur le bouton contextuel:

  • contenu arrangedObjects propriété du NSArrayController, en laissant le modèle chemin de clé vide (ou un ensemble à self si cela pose des problèmes)
  • contenu les valeurs de la même propriété arrangedObjects, avec un modèle de chemin de clé « fullName »
  • objet sélectionné à la propriété du selectedLanguage LanguageKeeper

Enfin, liez selectedLanguageISOName sur le LanguageKeeper à la propriété appropriée du Contrôleur par défaut utilisateur. (Vous ne pouvez pas lier directement le bouton contextuel à l'UDC, car le bouton contextuel a besoin de l'un de vos objets modèles.)

Vous pouvez également essayer de lier la liaison de contenu du bouton contextuel au isoName s et content-values ​​se lie aux fullName s des dictionnaires du tableau, mais je me méfie beaucoup de l'utilisation d'objets primitifs en tant qu'objets modèles. J'ai eu trop de problèmes de cela dans le passé. En outre, l'utilisation d'objets modèles est payante à long terme, et ils sont très amusants à travailler.

Donc, avec tout ce qui précède en place, voici ce qui se passe:

utilisateur change la valeur du bouton pop-up
  1. Le bouton contextuel change la valeur de sa propriété objet sélectionné.
  2. Cela modifie la propriété selectedLanguage du LanguageKeeper.
  3. Cela modifie l'autre propriété (selectedLanguageISOName) du LanguageKeeper.
  4. Cela modifie la valeur par défaut de l'utilisateur via l'UDC.
Un autre objet a change la valeur par défaut de l'utilisateur
  1. Les messages UDC notifications au sujet de la valeur ayant changé. Ceci modifie la propriété selectedLanguageISOName du LanguageKeeper.
  2. Cela modifie l'autre propriété (selectedLanguage) du LanguageKeeper.
  3. Cela modifie la valeur de la propriété d'objet sélectionné du bouton contextuel.
  4. L'utilisateur voit la nouvelle sélection fullName dans le menu contextuel.

Si vous ne comprenez pas une partie de cette réponse, veuillez demander des éclaircissements.

+0

Désolé, cela a pris tellement de temps pour vous revenir sur celui-ci. J'ai finalement mis en place comme vous l'avez spécifié (avec quelques différences mineures) et ça marche très bien. Merci! – dreamlax

Questions connexes