Изображение основных данных не будет загружаться в ячейку изображения NSTableView - PullRequest
0 голосов
/ 19 мая 2010

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

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

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

Большое спасибо.

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

Ответы [ 2 ]

2 голосов
/ 19 мая 2010

Я не уверен, что происходит, чтобы вызвать вашу проблему, но есть простой способ выяснить. Подключите 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 или любой другой метод, который вы хотите использовать вместо него.

0 голосов
/ 12 февраля 2015

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

...