Изображение основных данных не загружается в ячейку изображения NSTableView

В моем коде я сохраняю изображение в моей модели базовых данных (работает нормально). Если я настрою свое представление на NSImageView и свяжу его данные с ключом контроллера: selection и modelKeyPath: myImagePath, это сработает. Он покажет каждое изображение для выбранной строки.

Затем я создаю новый столбец в моем NSTableView и перетаскиваю ячейку изображения на столбец. Однако я не могу получить привязки основных данных, чтобы изображение отображалось в ячейке. Я пытался связать и значение и данные, но не повезло.

Поскольку я уверен, что изображение хранится правильно, что я делаю неправильно в своем связывании, чтобы изображение не отображалось в ячейке таблицы?

Спасибо.

(Мое прошлое: новый разработчик Cocoa, который недавно прошел всю книгу Hillegass.)

2 ответа

Решение

Я не уверен, что происходит, чтобы вызвать вашу проблему, но есть простой способ выяснить. Подключите NSValueTransformer к привязке. Затем в этом преобразователе вы можете записать материал, чтобы узнать, передаете ли вы значение nil, или вы можете преобразовать значение ваших данных в NSImage и передать его обратно... в основном вы можете делать все, что захотите в классе преобразователя. Вот один из них, который я использую для данных изображения в модели базовых данных.

@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

В классе AppController вы инициализируете преобразователь:

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

Затем в Интерфейсном Разработчике вы помещаете DataToImageTransformer для привязки. Теперь у вас есть контроль над связыванием, и вы можете делать это, как я объяснил ранее в классе преобразователя. Обратите внимание, что я использую NSKeyedArchiver для преобразования NSImage в данные и обратно, но вы можете использовать tiffRepresentation или любой другой метод, который вы хотите использовать вместо него.

Если у кого-то возникают проблемы с предложенной техникой с Xcode 6. Я создал проект Swift, используя приложение на основе документов. При использовании элемента управления ImageWell (NSImageView) привязки работают напрямую, без необходимости использования преобразователя. Подробно, однако, вы привязываете к привязке данных самого представления, а не к объекту ImageCell под ним.

Другие вопросы по тегам