Связывание внутри NSTableCellView

Я использую представление NSOutlineView, и я хочу связать NSSlider и NSTextfield с ключом NSDictionary (@ "" duration "). Словарь является свойством моего подкласса NSTableCellView. Я столкнулся с ошибкой при попытке настроить привязка:

Ошибка :

*** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<NSApplication 0x100506400> addObserver:<NSTextValueBinder 0x102609a90> forKeyPath:@"info.duration" options:0 context:0x10260c820] was sent to an object that is not KVC-compliant for the "info" property.'

.h:

#import <Cocoa/Cocoa.h>

@interface ObjectFileTableCellView : NSTableCellView {
    NSTextField *_textFieldFilePath;
    NSTextField *_textFieldDesription;
    NSButton *_checkBox;
    NSDictionary* _info;

    NSSlider*  _slider;
    NSTextField* _labelStartTime;
}


@property(retain) IBOutlet NSTextField *textFieldFilePath;
@property(retain) IBOutlet NSTextField *textFieldDescription;
@property(retain) IBOutlet NSTextField *labelStartTime;
@property(retain) IBOutlet NSSlider *slider;
@property(retain) IBOutlet NSButton *checkBox;

@property(retain) NSDictionary* info;

@end

.m:

- (NSView *)outlineView:(NSOutlineView *)outlineView viewForTableColumn:(NSTableColumn *)tableColumn item:(id)item{
    if ([[tableColumn identifier] isEqualToString:@"Files"]) {

        if ([item isKindOfClass:[OMN_Object class]])
        {

// ВЫПОЛНЕНО - (NSView *) outlineView: (NSOutlineView *) OutlineView viewForTableColumn: (NSTableColumn *) tableColumn item: (id) item {if ([[tableColumn identifier] isEqualToString: @ "Files"]) {

    if ([item isKindOfClass:[OMN_Object class]])
    {
        OMN_Object *o = item;

        ObjectFileTableCellView *v = [outlineView makeViewWithIdentifier:@"FileCell" owner:self]; // File'S owner


                hide = NO;
                NSString* d = [o.fileInfoDetails valueForKey:@"duration"];
                [v.slider setMinValue:0];
                [v.slider setMaxValue:[d doubleValue]];

                NSString *val = [NSString stringWithFormat:@"%f", v.slider.doubleValue];
                [v.labelStartTime setStringValue:val];
                [o.fileInfoDetails setValue:val forKey:@"startTime"];
                v.info = o.fileInfoDetails;

    ...

Мое представление NSOutlineView:

NSTableColumn

NSTableColumn:

Последний

Настройка привязки NSTextField:

Настройка привязкиНастройка привязки 2

Желаемый результат:

Джими Хендрикс

Как настроить привязку, чтобы получить то, что я хочу?


person Elfoiros    schedule 23.08.2013    source источник


Ответы (2)


Вы пытаетесь привязать info.duration к самой ячейке, а не к текстовому полю, предполагая, что «Владелец файла» действительно ваш ObjectFileTableCellView.

Используйте labelStartTime в качестве ключа контроллера при настройке привязки.

Еще раз проверьте конфигурацию привязок для слайдера; вы могли совершить аналогичную ошибку.

person Extra Savoir-Faire    schedule 23.08.2013
comment
См. Мою правку: ObjectFileTableCellView * v = [outlineView makeViewWithIdentifier: @FileCell owner: self]; // Владелец файла - person Elfoiros; 23.08.2013
comment
В вашем заявлении табличное представление владеет представлением ячейки. Это не имеет ничего общего с отношениями между представлением ячейки и привязками между его информационным словарем и его текстовым полем в Интерфейсном Разработчике. - person Extra Savoir-Faire; 23.08.2013
comment
Вы пытались сделать то, что я сказал вам в своем ответе? - person Extra Savoir-Faire; 23.08.2013
comment
Да, я пробовал, но не могу изменить ключ полевого контроллера. Что вы думаете о программной привязке текстового поля к FileCell.info.duration вместо File Owner.info.duration с IB? - person Elfoiros; 23.08.2013
comment
Стоит попробовать. Но всегда помните исходное сообщение об ошибке: вы пытаетесь выполнить привязку к чему-то, что не соответствует KVC для вашего ключевого пути. - person Extra Savoir-Faire; 23.08.2013
comment
Попробую это после выходных. Любые другие предложения приветствуются :-) - person Elfoiros; 23.08.2013
comment
File's Owner.info.duration Не имеет смысла, потому что File's Owner не похож на схему класса. Информация словаря является свойством ObjectFileTableCellView. Я прав ? - person Elfoiros; 23.08.2013
comment
Да, именно так. - person Extra Savoir-Faire; 23.08.2013

Как было сказано ранее, File's Owner.info.duration не имеет смысла, потому что File's Owner не похож на схему класса. Информация словаря является свойством ObjectFileTableCellView.

Я программно привязал NSTextfield к info.duration, и он отлично работает!

person Elfoiros    schedule 26.08.2013