Domanda

Ho già ucciso un giorno su questo argomento e ancora avuto alcuna idea su come potrebbe essere fatto in modo corretto.

sto usando NSOutlineView alla gerarchia di visualizzazione del file system. Per ogni riga nella prima colonna ho bisogno di casella di visualizzazione, icona associata e il nome del file o directory. Dal momento che non c'è modo standard di fare questo, ho sottoclasse NSTextFieldCell utilizzando entrambi gli esempi SourceView e PhotoSearch, value vincolante in IB alla proprietà name della mia classe oggetto albero però NSTreeController. Sto usando drawWithFrame:inView: di override per dipingere casella di controllo e immagine, l'inoltro del testo di disegno a super. Sto anche utilizzando trackMouse:inRect:ofView:untilMouseUp: override per l'interazione casella maniglia.

Tutto andava bene fino a quando ho notato che il pulsante una volta ho comunicato del mouse dentro la mia cella personalizzato, oggetto delle cellule viene copiato con copyWithZone: e questo oggetto temporaneo viene poi inviato un messaggio trackMouse:inRect:ofView:untilMouseUp:, rendendo impossibile modificare lo stato di controllo della cella originale risiede nella vista.

Dato che la questione oggetto è di circa vincolante, ho pensato che questo potrebbe essere la risposta, ma io assolutamente non capisco come dovrei collegare tutto questo casino di funzionare come previsto. Abbiamo provato questo:

[[[treeView outlineTableColumn] dataCell] bind:@"state"
                                      toObject:treeController
                                   withKeyPath:@"selection.state"
                                       options:nil];

, ma non è riuscito affatto. Sembra che io non sto ricevendo.

Può essere questo un modo completamente sbagliato che ho preso? Potresti suggerire una alternativa migliore o qualsiasi link per ulteriori letture?


UPD 1/21/11 : Ho anche provato questo:

[[[treeView outlineTableColumn] dataCell] bind:@"state"
                                      toObject:treeController
                                   withKeyPath:@"arrangedObjects.state"
                                       options:nil];

ma continuato a ottenere errori come "[<_NSControllerTreeProxy 0x ...> valueForUndefinedKey:]:. Questa classe non è un valore chiave di codifica conforme per lo stato chiave" e simili.

È stato utile?

Soluzione 2

Va bene, sono riuscito a fare quello che mi serviva da legame value delle colonne per arrangedObject di self (in IB) e sovrascrivendo setObjectValue: di cellulare in modo che appaia come:

- (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];
    }
}

cambiamento state effettivo viene eseguito all'interno di un'altra classe, il collegamento del suo metodo per selector di cella (in IB), che ho chiamata usando

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

da trackMouse:inRect:ofView:untilMouseUp: della cellula. Questo un altro metodo class'es aspetto:

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

Altri suggerimenti

Si associa il valore di una colonna della tabella (o di uno schema), non è stato un singolo cella di dati. valore dell'oggetto della cella di dati è impostato al valore corrente riga / del Col poi disegnato in modo da non avere potenzialmente migliaia (o milioni?) di cellule create senza una buona ragione.

Inoltre, si desidera che l'albero o matrice del controller arrangedObjects , non la sua selezione.

Bind il della colonna valore del controller albero arrangedObjects come chiave di controllo, e "stato", come il percorso della chiave modello IB; o @ "arrangedObjects.state" nel codice come sopra.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top