Как привязать NSMenuItem к NSArrayController

Как связать включенное состояние NSMenuItem с выбором NSArrayController? Я пробовал привязать включенное состояние элемента к selectedObjects или selectedIndexes контроллера, и ни в том, ни в другом случае элемент меню никогда не активируется, когда есть выбор. В ИБ я снял галочку "включить". Я просто хочу, чтобы NSMenuItem был включен, когда в таблице есть выбор. Моя таблица допускает множественный выбор, и я также использую кнопку, которая привязана к selectedObjects. @ Count, а кнопка включает / отключает, как ожидалось, поэтому я подумал, что использование того же пути к клавишам будет работать и для элемента меню, но нет. Это не может быть трудным, поскольку я не могу найти ответ через Google, поэтому я считаю, что это должно быть просто. Спасибо


person Lazloman    schedule 30.03.2011    source источник


Ответы (1)


Включенная привязка должна получить значение BOOL и, к сожалению, не будет просто обрабатывать любой старый объект как логическое значение True. К счастью, NSValueTransformer делает это легко. Есть пара констант, названных в _ 3_ Справочник по классам, который можно использовать на панели привязок в IB.

В вашем случае вы можете привязать путь ключа модели к «selectedObjects» и ввести «NSIsNotNil» в поле «Преобразователь значений». Преобразователь придает привязке необходимое значение BOOL.

person jscs    schedule 30.03.2011
comment
Хорошо, я попробовал это, но когда я установил путь для ключей как myarraycontroller.selectedObjects, я получил! в котором говорится, что Xcode не может разрешить ключевой путь. Кстати, я использую Xcode 4. Мой пункт меню и контроллер массива находятся в разных Xib, если это имеет значение. - person Lazloman; 31.03.2011
comment
Да, это имеет значение. Вы не можете просто так привязать xib-файлы. У объектов в одном нет возможности узнать об объектах в другом. Вам нужно будет связать элемент меню и контроллер массива через объект, имеющий ссылку на оба xib. Возможно, делегат вашего приложения может иметь ссылку на объект, который является владельцем файла второго? - person jscs; 31.03.2011
comment
Вот что я подозревал. У меня есть ссылка на делегата моего приложения, и IB разрешает имя контроллера массива, когда я ввожу его в поле Model Key Path (Xcode 4), но когда я добавляю selectedObjects, то есть (myArrayController.selectedObjects), я получаю! и он говорит, что Xcode не может разрешить введенный ключевой путь. Да ладно, я могу просто сделать это в коде, если понадобится. - person Lazloman; 31.03.2011
comment
@Lazloman: Я не знаю, отражает ли автозаполнение в IB фактическую область видимости. Это может. Хотя подождите секунду. Ваша привязка не может быть myArrayController.selectedObjects. Это должно быть что-то вроде: Объект, привязанный к: Владельцу файла; Путь к ключу модели: myAppDelegateReference.myArrayControllerOutlet; Ключ контроллера: selectedObjects. Вы поместили новый объект во второй наконечник и настроили его так, как будто это делегат приложения? Это не сработает. Он создает другой объект. Да, вам придется написать какой-то код, но он просто настраивает два ivars, один из которых является IBOutlet. - person jscs; 31.03.2011
comment
Я установил его на владельца файла, а остальное, что я написал, было ключевым путем. Хорошо, позвольте мне создать новую розетку и посмотреть, как это должно работать. Я вернусь. - person Lazloman; 01.04.2011
comment
@Lazloman: Это совершенно другой вопрос, чем тот, который вы задали изначально. Существует несколько вопросов SO, касающихся доступа к объектам между перьями: 1 2 3 4 5 - person jscs; 01.04.2011