Frage

Ich arbeite daran, alten Code (Ära 10.2) von der NSCoding/plist-basierten Archivierung auf die Verwendung von Core Data zu portieren.Ich habe eine NSOutlineView mit einer benutzerdefinierten NSTextFieldCell.Die Gliederungsansicht ist an einen NSTreeController gebunden, um die Daten bereitzustellen.

Das Bindungsmodell sieht so aus:

NSTreeController:Verwalteter Objektkontext -> Controller.managedObjectContext

NSoutlineView -NStableColumn -Wert -> Baumcontroller: ArrangedObjects: itemDictionary

Die NSOutlineView verfügt über eine benutzerdefinierte NSTextFieldCell-Unterklasse, die ein Bild neben dem Textfeld hinzufügt. Daher übergebe ich die Werte von NSManagedObject als NSMutableDictionary mit dem Namen itemDictionary an sie, damit ich den Titel und die isChecked-Schlüsselwerte abrufen und festlegen kann.

Ich stoße auf Probleme, wenn ich den Wert des Textfelds aktualisiere und diesen geänderten Wert an meine verwaltete Objektinstanz zurückgebe.Nachdem der Benutzer auf den Titelwert doppelklickt und ihn bearbeitet, wird er an übergeben -(id)objectValue, aber ich bin mir nicht sicher, was der nächste Schritt ist, um das Update an meine NSManagedObject-Instanz weiterzugeben.Der Code, den ich bisher zum Lesen und Festlegen von Werten in meiner NSTextFieldCell-Unterklasse habe, ist unten:

- (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];
}
War es hilfreich?

Lösung

Ich habe herumgefragt und dies ist die Empfehlung, die mir jemand gegeben hat;es sieht vernünftig aus.

Gehen Sie in Ihrer NSCell-Unterklasse in der Methode, die von der Ereignisschleife beim Festlegen eines neuen Werts aufgerufen wird, etwa so vor:

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

Hierbei handelt es sich um einen ziemlich allgemeinen Code, der die in der Tabellenspalte verfügbaren Bindungsinformationen nutzt, um das Modellobjekt und den Schlüsselpfad abzurufen, an den Ihre Änderungen übertragen werden sollen, und um generisches KVC zum Übertragen der Änderungen zu verwenden.Es sollte sowohl für Tabellen- und Gliederungsansichten als auch für beliebige Modellobjekte funktionieren, ob Kerndaten oder nicht.

Andere Tipps

würde ich wahrscheinlich diesen Ansatz in einer anderen Art und Weise, durch die outlineView:willDisplayCell:forTableColumn:item: Delegatmethode Implementierung und die isChecked Eigenschaft der Zelle dort einstellen, anstatt von innerhalb der Zelle Unterklasse. Sie würden dann binden nur die Spalt direkt an arrangedObjects.title, so dass der Standard-Bearbeitungsmechanismus darauf achten würde das Grundstück, auf der verwalteten Objektinstanz zu setzen.

IIRC, der item Parameter Sie übergeben bekommen tatsächlich eine NSTreeNode Instanz sein, dessen representedObject Eigenschaft gibt Ihnen die NSManagedObject Instanz für diese Zeile, so können Sie bekommen, was Informationen, die Sie von ihm brauchen diese Art und Weise.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top