2010-05-19 3 views
0

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

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

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

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

(Мой фон:. Новый какао-разработчик, который недавно прошел через всю 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]; 
} 

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

+0

Спасибо, это сработало! Единственная проблема заключается в том, что я получаю устаревшее предупреждение, связывая Data с NSTableColumn. Но ваша стратегия сохранения данных изображения с использованием NSKeyedArchiver и извлечения его с помощью этого трансформатора была успешной. – jcady

+0

Я помню что-то о том, что одна из привязок устарела, поэтому вместо этого используйте другую привязку ... это привязка значения? Вероятно, вы также можете использовать это с этой привязкой, и если не нужно просто модифицировать трансформатор по мере необходимости, чтобы возвращать любые объекты. – regulus6633

0

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