Frage

In meinem Code, den ich zu speichern ein Bild in meinem Core Data-Modell (funktioniert gut). Wenn ich meine Ansicht einrichten, um eine NSImageView zu haben und binden ihre Daten an Controller-Taste: Auswahl und modelKeyPath: myImagePath, es funktioniert. Es wird jedes Bild für die ausgewählte Zeile angezeigt.

ich erstellen Sie eine neue Spalte in meinem NSTableView und ziehen Sie eine Bildzelle auf die Säule. Allerdings kann ich nicht meine Core Data Bindings erhalten, um das Bild zeigen, haben in der Zelle auf. Ich habe versucht, sowohl Wert und Datenbindung, aber kein Glück.

Da bin ich sicher, dass das Bild richtig gespeichert ist, was ich falsch tue in meinem Bindung um das Bild zu verhindern, dass in der Tabellenzelle angezeigt?

Vielen Dank.

(Mein Hintergrund. Neue Cocoa-Entwickler, die vor kurzem durch das gesamte Hillegass Buch gegangen ist)

War es hilfreich?

Lösung

Ich bin nicht sicher, was passiert, um Ihr Problem zu verursachen, aber es ist eine einfache Möglichkeit, um herauszufinden. Schalte einen NSValueTransformer zur Bindungs. Dann in diesem Transformator kann man Sachen anmelden, um herauszufinden, ob Sie einen Nullwert vorbei sind, oder Sie können Ihren Datenwert in eine NSImage verwandeln und das zurück passieren ... im Grunde kann man tun, was Sie in der Transformator Klasse wollen. Hier ist eine I Verwendung von Bilddaten in einem Kern-Datenmodell.

@interface DataToImageTransformer : NSValueTransformer {

}

@end


@implementation DataToImageTransformer

+ (Class)transformedValueClass {
    return [NSImage class];
} // the class of the return value from transformedValue:

+ (BOOL)allowsReverseTransformation {
    return YES;
} // if YES then must also have reverseTransformedValue:

- (id)transformedValue:(id)value {
    if (value == nil || [value length] < 1) return nil;
    NSImage* i = nil;
    if ([value isKindOfClass:[NSData class]]) {
        i = [NSKeyedUnarchiver unarchiveObjectWithData:value];
    }
    return i;
}

- (id)reverseTransformedValue:(id)value {
    if (value == nil) return nil;
    NSData* d = nil;
    if ([value isKindOfClass:[NSImage class]]) {
        d = [NSKeyedArchiver archivedDataWithRootObject:value];
    }
    return d;
}

@end

In AppController Klasse, die Sie initialisieren den Transformator:

+ (void)initialize {
    DataToImageTransformer *transformer = [[DataToImageTransformer alloc] init];
    [NSValueTransformer setValueTransformer:transformer forName:@"DataToImageTransformer"];
    [transformer release];
}

Dann in Interface Builder setzen Sie "DataToImageTransformer" in für die Bindung. Jetzt haben Sie die Kontrolle über die Bindung und kann tun, was ich früher in der Transformator-Klasse erklärt. Beachten Sie, dass ich NSKeyedArchiver mit einem NSImage, um Daten zu konvertieren und wieder zurück, aber Sie können tiffRepresentation oder jede andere Methode, die Sie wollen an seiner Stelle verwendet werden.

Andere Tipps

Wenn jemand Probleme mit der vorgeschlagenen Technik mit Xcode 6. mit habe ich ein Swift-Projekt, mit der Document-basierten Anwendung. Mit einer Imagewell Kontrolle (NSImageView), arbeiten Bindungen direkt ohne die Notwendigkeit Wert eines Transformators. Ein Detail aber setzen Sie auf Datenbindung der Ansicht Bindung selbst, nicht auf dem Imagecell objet darunter.

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