Изображение основных данных не загружается в ячейку изображения 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 под ним.