Binding singolo NSCell a più valori
-
13-10-2019 - |
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.
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.