2009-12-22 2 views
1

Ma configuration est une NSTableView avec une colonne liée au NSUserDefaults. Maintenant, cela fonctionne parfaitement, tant que rien ne change dans ma vue de table. Quand je TRIE changer une valeur (toutes les chaînes simples) je reçois l'erreur suivante:Liez un NSTableView à un tableau dans NSUserDefaults: Mutable!

Error setting value for key path of object Acid (from bound object <NSTableColumn: 0x1796ef10> identifier: path with object ID 455 in nib named TXPreferencesWindow.nib): [<NSCFString 0x165297e0> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key .

Y at-il un moyen simple de rendre cela possible? Ou devrais-je simplement implémenter les méthodes Datasource et Delegate? (Si je l'ai fait en premier lieu, il aurait été plus rapide de toute façon ...)

Répondre

4

Votre erreur suggère qu'il y a un problème avec votre liaison, puisque le changement est envoyé à un objet NSCFString alors qu'il devrait être envoyé à un contrôleur.

Vous devriez en dire un peu plus sur ce que vous essayez de lier à la vue tabulaire afin que nous puissions vous dire comment vous l'avez configuré correctement.

Dans l'un de mes projets, j'ai lié un NSArray de NSMutableDictionary contenant un booléen éditable et une chaîne à NSTableView. J'ai utilisé un NSArrayController, dont le tableau de contenu est lié à un tableau dans le NSUserDefaultsController. Le contenu NSTableView est ensuite lié à arrangedObjects du contrôleur de réseau et la valeur des colonnes individuelles à arrangedObjects.dictionaryKey. IIRC il est important d'avoir "Handles Content as Compound Value" sélectionné dans le contrôleur.

+0

J'ai essayé de mapper la valeur de la colonne directement sur les valeurs par défaut de l'utilisateur. Donc, il semble que l'ajout d'un NSArrayController serait le meilleur moyen. Mais je l'ai déjà changé en NSTableDatasource enroulé autour de NSUserDefaults. Il n'y avait pas beaucoup de code et j'ai aussi un contrôle parfait. – V1ru8

2

Liaisons vraiment n'aime pas aller sans les objets du modèle. NSUserDefaultsController fonctionne pour des valeurs simples, comme lier une case à cocher à une valeur par défaut qui devrait avoir une valeur booléenne, mais lier une colonne de table à un tableau de chaînes ne fonctionnera dans aucun contexte - la vue table nécessite des objets modèles qu'elle peut demander pour les valeurs pour le chemin de la clé du modèle. N'avoir aucun chemin de clé de modèle est ce qui vous a donné le message d'erreur que vous voyez ("pas de valeur-clé-conforme pour la clé [chaîne vide insérée].").

Votre solution actuelle est probablement la plus simple. Un autre, qui peut être meilleur dans certains cas, consisterait à décider quelles sont ces chaînes et, et de construire un objet modèle autour de cela. (Il n'a pas besoin d'être complexe, même si tout ce qu'il possède est une propriété de chaîne, il n'y a rien de mal à cela.) Ensuite, ayez une propriété de tableau de ceux-ci dans un contrôleur de votre propre création; initialisez cette propriété à partir du tableau de chaînes à partir de valeurs par défaut dans votre initialiseur, et mettez à jour le tableau de chaînes par défaut dans le setter de la propriété.

Questions connexes