У меня была трещина при реализации привязок для моего собственного подкласса NSView. Он работает, но есть проблемы с циклами сохранения при привязке к File's Owner из файла nib. Немного поучившись, я обнаружил, что Apple имела такую же проблему несколько лет назад, но исправила ее каким-то магическим недокументированным классом (NSAutounbinder).Можете ли вы вручную реализовать привязки какао?
Здесь подробно обсуждается проблема цикла удержания http://www.cocoabuilder.com/archive/message/cocoa/2004/6/12/109600. Обходной путь заключается в том, чтобы развязать все привязки, прежде чем оконный контроллер будет освобожден, не раньше освобожден, в месте, таком как windowWillClose :. Мне это кажется ненужным.
Мой вопрос заключается в следующем: есть ли способ сделать пользовательские привязки, которые работают так же хорошо, как те, которые сделаны Apple, без использования недокументированных функций? Неужели я ошибаюсь?
ОБНОВЛЕНИЕ 2: Я нашел решение, которое позволяет вручную внедренные привязки работать точно так же, как привязки Apple. Он использует недокументированный класс NSAutounbinder, фактически не используя недокументированные функции. Я отправлю решение позже сегодня.
UPDATE: Я попытался с помощью exposeBinding:
, и это, кажется, не имеет никакого значения. Однако реализация NSObject
bind:toObject:withKeyPath:options:
работает наполовину. Он пропагандирует изменения от bindee до связующего (то есть от модели/контроллера для просмотра), но не работает обратным образом. Кроме того, хотя наблюдатель, очевидно, наблюдается, observeValueForKeyPath:ofObject:change:context:
никогда не срабатывает.
Пример проекта здесь: http://www.tomdalling.com/wp-content/BindingsTest.zip
документация Apple, указывает на то, что вы, по сути, должны переопределить bind:toObject:withKeyPath:options:
для осуществления ручного привязок. Смотрите здесь: http://developer.apple.com/documentation/Cocoa/Conceptual/CocoaBindings/Concepts/HowDoBindingsWork.html
SIDE ПРИМЕЧАНИЕ: Я исследовал, как работает без документов NSAutounbinder, и вот что я знаю.
Когда привязка создается в NSWindowController, связанный объект на самом деле является NSAutounbinder, который получен из NSWindowController с - [NSWindowController _autounbinder]. NSAutounbinder - не сохраняющий прокси-сервер для объекта NSWindowController. Он не удерживает, чтобы избежать проблемы с циклом сохранения.
Когда - вызывается [NSWindowController release] и сохраняетсяCount == 1, NSAutounbinder отсоединяет все привязки к себе. Это гарантирует, что к объекту не будут висящие указатели до его освобождения.
Пока CocoaBuilder не работает, вы можете найти соответствующую тему на http://lists.apple.com/archives/cocoa-dev/2004//Jun/msg00835.html – s4y