2009-06-04 6 views
0

Ich arbeite an der Portierung einiger alter Codes (10.2-Ära) von der NSCoding/Plist-basierten Archivierung zur Verwendung von Core Data. Ich habe eine NSOutlineView mit einer benutzerdefinierten NSTextFieldCell. Die Gliederungsansicht ist an einen NSTreeController gebunden, um die Daten bereitzustellen.Gebundenes Wörterbuch basierend auf NSTextFieldCells bearbeitetem Wert aktualisieren

Die Bindungen Modell sieht wie folgt aus:

NSTreeController: Managed Object Context -> Controller.managedObjectContext

NSOutlineView der NSTableColumn Value -> Baum Controller: arrangedObjects: itemDictionary

Die NSOutlineView hat ein Benutzerdefinierte NSTextFieldCell-Unterklasse, die ein Bild neben dem Textfeld hinzufügt, also übergebe ich die NSManagedObject-Werte als NSMutableDictionary namens itemDictionary, damit ich den Titel und den isChecked-Schlüssel va ziehen und setzen kann Lues.

Wo ich auf Probleme stoße, wird der Wert des Textfelds aktualisiert und der geänderte Wert an die Instanz meines verwalteten Objekts zurückgegeben. Nachdem der Benutzer auf den Titelwert doppelklickt und ihn bearbeitet, wird er an -(id)objectValue übergeben, aber ich bin mir nicht sicher, was als nächster Schritt das Update an meine NSManagedObject-Instanz weitergeben soll. Der Code, den ich habe bisher für das Lesen und Werte in meiner NSTextFieldCell Unterklasse Einstellung unter:

- (void)setStringValue:(NSString *)aString { 
    [super setObjectValue:aString]; 
} 

- (void)setObjectValue:(id <NSCopying>)anObject { 
    id cellValues = anObject; 

    [super setObjectValue:[cellValues valueForKey:@"title"]]; 
    [self setCheckState:[[cellValues valueForKey:@"isChecked"] integerValue]]; 
} 

- (id)objectValue { 
    return [super objectValue]; 
} 
+0

Der Code ist in Ihrer NSTextField-Unterklasse? –

+0

Ja, das ist das Fleisch der Unterklasse NSTextFieldCell. –

Antwort

3

Ich fragte herum, und das ist die Empfehlung, die jemand mir gab; es sieht vernünftig aus.

In Ihrem NSCell Unterklasse, in welchem ​​Verfahren durch die Ereignisschleife aufgerufen wird, um einen neuen Wert auf Einstellung, etwas tun, wie folgt aus:

- (void)whateverMethodInCellSubclassIsTriggeredByEventLoop:(id)value { 
    NSTableView *tableView = [self controlView]; 
    NSTableColumn *column = [[tableView tableColumns] objectAtIndex:[tableView editedColumn]]; 
    NSInteger rowIndex = [tableView editedRow]; 
    NSDictionary *bindingInfo = [column infoForBinding:NSValueBinding]; 
    id modelObject = nil; 

    if ([controlView isKindOfClass:[NSOutlineView class]]) { 
     NSTreeNode *item = [outlineView itemAtRow:rowIndex]; 
     modelObject = [item representedObject]; 
    } else if ([controlView isKindOfClass:[NSTableView class]]) { 
     NSArrayController *controller = [bindingInfo objectForKey:NSObservedObjectKey]; 
     modelObject = [[controller arrangedObjects] objectAtIndex:rowIndex]; 
    } 

    [modelObject setValue:value forKeyPath:[bindingInfo objectForKey:NSObservedKeyPathKey]]; 
} 

Das ist ziemlich generische Code, der die Bindung Informationen auf dem Tisch vorhanden nutzt Spalte, um das Modellobjekt und den Schlüsselpfad zu erhalten, auf den Ihre Änderungen übertragen werden sollen, und um generische KVCs zum Übertragen der Änderungen zu verwenden. Es sollte sowohl für Tabellen- und Gliederungsansichten als auch für beliebige Modellobjekte, Core Data, funktionieren.

0

ich dies wahrscheinlich auf eine andere Weise nähern würde, indem die outlineView:willDisplayCell:forTableColumn:item: Delegatmethode Implementierung und Einstellung der isChecked Eigenschaft der Zelle dort, anstatt aus der Zelle Unterklasse. Sie würden diese Spalte dann direkt an arearchedObjects.title binden, sodass der Standardbearbeitungsmechanismus dafür sorgt, dass die Eigenschaft für die Instanz des verwalteten Objekts festgelegt wird.

IIRC, der item Parameter, den Sie übergeben bekommen, ist tatsächlich eine NSTreeNode-Instanz, deren representObject -Eigenschaft Ihnen die NSManagedObject-Instanz für diese Zeile liefert, damit Sie alle Informationen erhalten, die Sie benötigen.

+0

outlineView: willDisplayCell: forTableColumn: item funktioniert zum Lesen des Wertes, aber was ist mit der Aktualisierung des IsChecked-Wertes in der Tabellenzelle? In der Vergangenheit habe ich gerade Delegate-Methoden in meiner NSCell-Unterklasse eingerichtet, um die Änderungen zu verarbeiten, nachdem etwas geklickt und in meinem Controller implementiert wurde. Es scheint, als könnte/sollte ich das mit KVC/KVO sauberer machen. Vielleicht bin ich falsch? –

Verwandte Themen