Поиск и устранение неисправностей привязки какао

Приложения, использующие привязку Какао, могут обеспечить проблему при попытке диагностировать проблемы. Эта статья обрисовывает в общих чертах некоторые общие вопросы, с которыми встречаются в приложениях, использующих привязку Какао, и дает представления относительно исправления проблемы.

Мой контроллер набора не выводит на экран текущие данные

Это обычно вследствие Вашего приложения, изменяющего содержание набора способом, который не является совместимым наблюдением значения ключа. Изменение использования массива addObject: или removeObject: не достаточно.

Необходимо или реализовать индексируемые средства доступа для ключа набора классе модели или попросить у модели наблюдающего значение ключа осведомленного прокси набора использование одного из следующих методов:

- (NSMutableArray *)mutableArrayValueForKey:(NSString *)key
- (NSMutableArray *)mutableArrayValueForKeyPath:(NSString *)keyPath
 
- (NSMutableSet *)mutableSetValueForKey:(NSString *)key
- (NSMutableSet *)mutableSetValueForKeyPath:(NSString *)keyPath

Эти возвращаются, прокси набора возражает, что можно тогда использовать с методами мутации NSMutableArray или NSMutableSet, и надлежащие уведомления наблюдения значения ключа отправляются.

Можно также изменить содержание через контроллер набора с помощью методов, описанных в Программно Изменении Содержания Контроллера.

Изменение значения в пользовательском интерфейсе программно не отражается в модели

Если Вы изменяете значение элемента в пользовательском интерфейсе программно, например отправляя NSTextField a setStringValue: сообщение, модель не обновляется с новым значением.

Это - ожидаемое поведение. Вместо этого необходимо изменить объект модели с помощью наблюдающего значение ключа совместимого способа.

Изменение значения свойства модели программно не отражается в пользовательском интерфейсе

Если изменения, внесенные в значение модели программно, не отражаются в пользовательском интерфейсе, это обычно указывает, что объект модели не является наблюдением значения ключа, совместимым для свойства, или что Вы изменяете значение способом, обходящим наблюдение значения ключа. Необходимо гарантировать что:

Привязка с неправильным ключевым путем

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

Следующее является примером сообщения отладки, выводящегося к журналу выполнения или консоли:

2005-05-10 03:53:29.764 VuesActivity[2216] *** NSRunLoop ignoring exception '[<Member 0x379180> valueForUndefinedKey:]:
this class is not key value coding-compliant for the key named.' that raised during posting of delayed perform
with target 37f6d0 and selector 'invokeWithTarget:'

Это сообщение указывает, что экземпляр Задействованного класса не является кодированием значения ключа, совместимым для «названного» ключа. В этом случае ошибка состоит в том, что корректный Идентификатор элемента является фактически «именем».

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

defaults write com.yourdomain.yourapplication NSBindingDebugLogLevel 1

Можно также установить уровень отладки в XCode:

  1. Выберите исполнимую программу приложения в Исполнимой группе.

  2. Выберите пункт меню Get Info в меню File.

  3. Выберите вкладку Arguments в исполнимой информационной панели.

  4. Добавить -NSBindingDebugLogLevel 1 к “Параметрам, которые будут переданы в запуске” список.

После установки значения по умолчанию уровня отладки та же проблема, генерировавшая вышеупомянутое сообщение об ошибке теперь, генерирует следующую ошибку:

2005-05-10 04:02:32.146 VuesActivity[2241] Cocoa Bindings: Error accessing value for key path selection.named
of object <NSArrayController: 0x349ba0>[object class: Member, number of selected objects: 1]
(from bound object <NSTextField: 0x344380>): [<Member 0x37a660> valueForUndefinedKey:]: this class
is not key value coding-compliant for the key named.

Это предоставляет больше информации, которая может помочь Вам в разыскивании, какой элемент в Интерфейсном Разработчике был связан с неправильным ключевым путем. В этом случае это указывает, что привязка между NSTextField и NSArrayController с классом объекта Элемента, с помощью selection.named ключевой путь.

Даже если привязка отключила опцию «Raises For Not Applicable Keys», с обязательным набором уровня отладки к 1, любая привязка, сделанная к несуществующему ключу, заставит сообщение отладки быть распечатанным к консоли.

В настоящее время только уровень отладки 1 поддерживается.

Привязка моего пользовательского представления отключена в Интерфейсном Разработчике

Если Вы реализуете подкласс NSView и создаете палитру Interface Builder для того подкласса, реализации Вашего подкласса bind:toObject:withKeyPath:options: должен вызвать супер реализацию. Если Вы не делаете при установлении привязки в Интерфейсном Разработчике обязательные значения исчезают, и обязательные имена становятся отключенными и недоступными для редактирования.

Недоступный для редактирования/видимый/отключенный NSTextField становится доступным для редактирования/скрытым/включать

Если Вы отключаете редактирование для NSTextField в Интерфейсном Разработчике, и затем устанавливаете привязку с ним, можно найти, что поле тогда становится доступным для редактирования, когда работает приложение. Это обычно вследствие привязки значения, имеющей “Условно Наборы, которые включил Доступный для редактирования” параметр привязки.

Точно так же, если управление становится скрытым или включенным, необходимо проверить, что опции «Conditionally Sets Hidden» и «Conditionally Sets Enabled» привязки значения имеют ожидаемые настройки.

Привязка управления к значению, которое является интервалом без знака, вызывает исключение

Кодирование значения ключа обрабатывает преобразование NSNumbers и NSValues к некоторому известному скаляру и типам структуры, но в настоящее время не поддерживается интервал без знака. В контексте привязки необходимо рассмотреть преобразование значения с помощью NSValueTransformer, или в конкретном случае NSTextField, NSFormatter.

Представление, связанное с NSTreeController, не выводит на экран данные

Это часто вызывается, потому что не был установлен дочерний ключевой путь NSTreeController. Можно проверить, что это - причина путем проверки консоли или выполненного журнала для сообщений отладки. Посмотрите Пересекающее Древовидное Содержание с NSTreeController для получения дополнительной информации.

2005-06-23 02:46:53.198 MyApplication[6777] Cocoa Bindings: Cannot perform operation if childrenKeyPath is nil.

Столбец таблицы, содержащий элементы NSPopUpButtonCell, не является поддающимся сортировке

Столбцы Tableview, содержащие NSPopUpButtonCell или любой тип ячейки кроме NSTextField, не могут быть сортированы, если выбор ячейки связывается с помощью selectedObject или selectedObjects привязка. Если выбор связывается с selectedValue, selectedTag или selectedIndex, столбец является поддающимся сортировке.