подкласс NSWindowController Core Data

У меня есть новый вопрос, на который я безуспешно пытался найти ответы в Интернете. Задача проста: я хочу создать приложение на основе документа с основными данными, но изменить значения в некоторых объектах меток. Используя построитель интерфейсов, я могу построить базовую модель данных и заполнить ее, используя контроллер массива, таблицу и т. Д., И все это без написания какого-либо кода. Все идет нормально. Мой тестовый пример - построить базовую модель данных с объектами Box, имеющими атрибуты длины и ширины. Я хотел бы, чтобы метка отображала площадь, то есть длину * ширину для любого геометрически сложного :).

Итак, после просмотра я решил, что мне нужно создать подкласс NSWindowController и использовать его для обновления метки при выборе поля в таблице. Пытались это сделать, но потерпели неудачу. Прежде чем я даже прикреплю этикетку к оконному контроллеру, у меня возникнет проблема. Следуя комментариям к шаблону, я добавил это в Document.m:

- (void)makeWindowControllers
{
    NSLog(@"Adding custom Window Controller");
    MyWindowController* myWindowController = [[MyWindowController alloc] init];
    [self addWindowController:myWindowController];
}

Также добавил это в шаблон MyWindowController.m:

- (id)init
{
    self = [super initWithWindowNibName:@"MyWindowController"];
    return self;
}

Контроллер окна имеет свой собственный файл NIB из построителя интерфейса, куда я помещаю таблицу и метку и т. Д. Владелец файла установлен на MyWindowController. Наверное, забываю о других вещах, но это то, что я помню сейчас.

Сообщение журнала появляется при запуске, но затем я получаю исключение «этот класс не соответствует кодировке значения ключа для ключа managedObjectContext» до появления окна. Я предполагаю, что у меня нет контроллера окна, подключенного к классу документа должным образом? Другая моя мысль заключается в том, что контроллер массива находится в кончике оконного контроллера, а не в кончике документа, так что, может быть, он ищет не в том месте для managedObjectContext?


person user2555590    schedule 09.08.2013    source источник


Ответы (1)


Я бы попробовал другой подход: добавьте area в вашу Box сущность в качестве атрибута только для чтения. Автоматически создайте класс Box с помощью Xcode (пункт меню «Создать подкласс NSManagedObject» в меню «Редактор» при просмотре модели данных), затем добавьте его в Box.h

@property (weak, readonly) NSString * area;

и это в Box.m

- (NSNumber *)area
{
    return [NSNumber numberWithDouble:([[self length] doubleValue] - [[self width] doubleValue])];
}

+ (NSSet *)keyPathsForValuesAffectingArea
{
    return [NSSet setWithObjects:@"length", @"width", nil];
}

Если вы сделаете это, вы можете просто привязать area к значению метки, как вы это делаете для других свойств Box. Нет необходимости создавать подкласс NSWindowController или следить за изменениями.

person Dirk    schedule 19.03.2015