J'ai déjà tué un jour sur ce sujet et je ne savais toujours pas comment cela pourrait se faire correctement. J'utilise NSOutlineView
pour afficher la hiérarchie du système de fichiers. Pour chaque ligne de la première colonne, je dois cocher la case, l'icône associée et le nom du fichier ou du répertoire. Comme il n'y a pas de moyen standard pour cela, j'ai sous-classé NSTextFieldCell
en utilisant à la fois des exemples SourceView et PhotoSearch, en liant value
dans IB à name
propriété de ma classe d'élément d'arbre par NSTreeController
. J'utilise drawWithFrame:inView:
override pour peindre la case à cocher et l'image, en transférant le dessin de texte à super
. J'utilise également trackMouse:inRect:ofView:untilMouseUp:
override pour gérer l'interaction checkbox. Tout allait bien jusqu'à ce que je remarque qu'une fois que j'appuie sur le bouton de la souris dans ma cellule personnalisée, l'objet cellulaire est copié avec copyWithZone:
et que cet objet temporaire reçoit un message trackMouse:inRect:ofView:untilMouseUp:
, rendant impossible la modification de l'état de vérification la cellule d'origine résidant dans la vue.Liaison unique NSCell à plusieurs valeurs
Puisque l'objet de la question est sur la liaison, j'ai pensé que cela pourrait être la réponse, mais je ne comprends pas comment je devrais connecter tout ce désordre pour fonctionner comme prévu. Essayé ceci:
[[[treeView outlineTableColumn] dataCell] bind:@"state"
toObject:treeController
withKeyPath:@"selection.state"
options:nil];
mais n'a pas réussi du tout. On dirait que je ne comprends pas.
Est-ce que c'est un mauvais moyen que j'ai pris? Pourriez-vous suggérer une meilleure alternative ou des liens vers d'autres lectures?
UPD 21/01/11: J'ai aussi essayé ceci:
[[[treeView outlineTableColumn] dataCell] bind:@"state"
toObject:treeController
withKeyPath:@"arrangedObjects.state"
options:nil];
mais continué à obtenir des erreurs comme « [... < _NSControllerTreeProxy 0x> valueForUndefinedKey:]: cette classe n'est pas compatible avec le codage de valeur de clé pour l'état clé. " et similaire.
Ouais, c'est ce que je voulais dire parler de 'value'-'name' liant en premier lieu: Je l'ai déjà' bind arrangedObjects.name' à 'value' de la colonne outline, donc je ne peux pas le lier à 'arrangedObjects.state' en même temps (et il n'y a pas de liaison' state' dans la colonne que je peux utiliser). Comment est-ce possible? .. –
* Oh! * Désolé pour ça! Je ne crois pas que ce soit possible avec une cellule bouton de case à cocher. Je suis sûr que vous devez utiliser une colonne séparée pour la cellule de bouton de case à cocher elle-même (sans titre) si vous souhaitez utiliser les liaisons. –