2011-01-25 3 views
0

J'ai sous-classé NSTextField pour créer un contrôle personnalisé, et je veux lier une propriété (qui est un NSArray) de mon contrôle personnalisé à un NSArrayController. Cependant, je ne sais pas comment propager le tableau de mon contrôle à la NSArrayController. Le chemin de clé que j'utilise sur le NSArrayController est arrangedObjects.name. Par exemple, si je suis en train de propager le tableau (@"One", @"Two", @"Three") et j'utilise simplement:Lier le contrôle personnalisé à NSArrayController

[boundObject setValue:myArray forKeyPath:@"arrangedObjects.name"] 

il règlera la valeur de chaque élément de arrangedObjects.name au tableau (@"One", @"Two", @"Three"). Ce que je veux arriver est d'avoir le premier élément arrangedObjects.name mis à @"One", la deuxième valeur fixée à @"Two", etc.

NSTableColumn fait cela, donc je sais qu'il est possible, mais je ne peux pas comprendre comment il est mis en œuvre.

Quelle est la meilleure façon d'y parvenir?

+0

Vous devrez fournir un peu plus d'informations sur votre nouvelle propriété personnalisée. S'il vous plaît élaborer. –

+0

C'est simplement un 'NSArray *' appelé 'customContent' (à défaut d'un meilleur nom) qui est compatible avec le KVO. Je veux pouvoir le lier à un NSArrayController (bidirectionnel). Mais tout ce que je dois vraiment faire, je suppose, est de définir correctement le chemin de clé 'arrangedObjects.name' (comme décrit ci-dessus) sur' NSArrayController'. –

Répondre

0

Ok, eh bien, je pense que j'ai peut-être répondu à ma propre question. Je ne vais pas le marquer comme la bonne réponse au cas où quelqu'un pourrait me dire une meilleure façon de le faire. Cette façon est à peu près un hack.

Quoi qu'il en soit, je lisais NSArrayController ici: http://www.cocoadev.com/index.pl?NSArrayController qui dit:

Si valueForKeyPath:@"arrangedObjects.name" est envoyé à un contrôleur RAID, un (comme prévu) ramène un tableau de valeurs de nom, mais si un autre réplications d'objet Ce comportement, et la valeur de la colonne de la table est liée à cet objet, il affichera le tableau entier pour chaque ligne.

et

Vous lier la valeur d'un NSTableColumn-arrangedObjects.someKey. Si vous essayez d'appeler par programme valueForKeyPath:@"arrangedObjects.someKey" sur votre contrôleur RAID, vous récupérez le tableau résultant de l'appel valueForKey:@"someKey" sur le tableau - tout va bien. Donc, on pourrait penser que la valeur de NSTableColumn peut également être liée à mes objets someArray.someKey, mais cela ne fonctionnera pas (sur plusieurs niveaux).

Donc, fondamentalement, cela ressemble à des cas particuliers NSTableColumn ses liaisons pour NSArrayController et arrangedObjects qui est pourquoi il fonctionne dans le bon sens, et mon contrôle personnalisé ne fonctionne pas.

Cela ne semble pas très flexible, mais c'est la seule façon de le faire fonctionner. J'ai implémenté un cas spécial dans mes bindings pour NSArrayController et arrangedObjects et j'ai pu le faire fonctionner comme je le voulais.

Une meilleure solution serait très appréciée, cependant!

+0

Sans en savoir plus sur l'implémentation, je dirais que cela semble incorrect de stocker un tableau dans un NSTextField.Normalement, le contenu serait stocké et géré par un contrôleur. Le champ de texte devrait simplement être un canal pour ce contenu entre l'utilisateur et le contrôleur. Par exemple, disons que j'ai un NSTextField et que je demande à l'utilisateur d'entrer une série de valeurs séparées par des virgules (c'est-à-dire, un tableau de base). Je voudrais avoir un contrôleur qui prend la chaîne du champ de texte, puis analyser et stocker le contenu dans le contrôleur. – sosborn

Questions connexes