2011-01-20 3 views
2

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.

Répondre

1

D'accord, je suis parvenu à faire ce que je avais besoin par des colonnes pour value à l » self (en IB) arrangedObject de liaison et de setObjectValue: cellule primordiale pour qu'il ressemble à:

- (void) setObjectValue:(id)value 
{ 
    if ([value isMemberOfClass:[MyNodeClass class]]) 
    { 
     [super setObjectValue:[value name]]; 
     [self setIcon:[value icon]]; 
     [self setState:[value state]]; 
    } 
    else 
    { 
     if (!value) 
     { 
      [self setIcon:nil]; 
      [self setState:NSOffState]; 
     } 
     [super setObjectValue:value]; 
    } 
} 

Actual state changement est effectué dans une autre classe, reliant son procédé de selector de cellule (dans IB) que j'appel à l'aide

[NSApp sendAction:[self action] to:[self target] from:[self controlView]]; 

de trackMouse:inRect:ofView:untilMouseUp: de cellule. Cette autre méthode class'es ressemble à ceci:

- (IBAction) itemChecked:(id)sender 
{ 
    MyNodeClass* node = [[sender itemAtRow:[sender clickedRow]] representedObject]; 
    if (node) 
    { 
     [node setState:[node state] == NSOnState ? NSOffState : NSOnState]; 
    } 
} 
2

Vous associez une valeur de colonne (ou de contour) à une table, et non un état de cellule de données individuelle. La valeur de l'objet de la cellule de données est définie sur la valeur de la ligne/col actuelle, puis dessinée de sorte que vous ne disposez pas potentiellement de milliers (ou de millions?) De cellules créées sans raison valable.

En outre, vous souhaitez que l'arborescence ou le contrôleur de matrice disposeObjects, et non sa sélection.

Bind la valeur de colonne au arrangedObjects du contrôleur d'arbre que la touche de commande, et « état » en tant que chemin de clé modèle dans IB; ou @ "arrangedObjects.state" dans le code comme ci-dessus.

+0

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? .. –

+0

* 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. –

Questions connexes