NSPopupButton не обновляется при использовании setValue: forKey: против связанного поля CoreData

Я работаю над приложением на основе CoreData/Document. В одной области пользовательского интерфейса я настроил таблицу режимов просмотра с различными столбцами. В одном столбце есть NSPopupButton с настройкой привязки Selected Index как Table Cell View.objectValue.startupState.

Выбор любого из пунктов меню во всплывающем окне корректно обновит атрибут startupState объекта с индексом щелкнутого пункта меню, а также обновится текст NSPopupButton. Я убедился, что значение атрибута действительно обновляется при сохранении, закрытии и повторном открытии документа.

В другом столбце у меня есть NSPopupButton, привязанный аналогично другому атрибуту в том же объекте — Table Cell View.objectValue.mode. В зависимости от выбранного режима он изменит значение startupState с помощью ручной реализации setMode, которая в определенных случаях выполняет этот оператор:

[self setValue:[[NSNumber alloc] initWithInt:1] forKey:@"startupState"];

Проблема, с которой я сталкиваюсь, заключается в том, что NSPopupButton не обновляется, чтобы отображать текст пункта меню для выбранного индекса. Как и прежде, я сохранил, закрыл и снова открыл документ после того, как приведенный выше код запустился и был выбран правильный элемент/появился текст, поэтому я знаю, что вызов setValue обновил атрибут.

Любые идеи?


person Community    schedule 07.02.2014    source источник
comment
Можете ли вы опубликовать больше вашего пользовательского сеттера? Может быть, сообщения will/didChangeValue отсутствуют? также, если это логическое значение, почему бы не использовать [[NSNumber numberWithBool:YES]?   -  person Volker    schedule 07.02.2014
comment
startupState находится в CoreData или является производным? Он объявлен @динамическим? Кроме того, когда вы устанавливаете это состояние? Установлено ли это, когда всплывающее окно все еще всплывает?   -  person Wil Shipley    schedule 07.02.2014
comment
Спасибо Волкер! - в этом была проблема.   -  person    schedule 07.02.2014
comment
Просто чтобы ответить вам, я создал объекты в редакторе xcode, который манипулирует Document.xdatamodeld, и сказал ему создать подклассы NSManagedObject. Они объявлены @dynamic. Я установил начальное состояние из кода прямо сейчас в windowControllerDidLoadNib. Всплывающие окна не появляются в то время.   -  person    schedule 07.02.2014


Ответы (1)


Как упоминалось в комментариях, предложение Волкера решает эту проблему. Сообщения willChangeValueForKey и didChangeValueForKey необходимы вокруг вызова setValue:forKey следующим образом:

    [self willChangeValueForKey:@"startupState"];
    [self setValue:[[NSNumber alloc] initWithInt:1] forKey:@"startupState"];
    [self didChangeValueForKey:@"startupState"];
person Community    schedule 08.02.2014