Какой хороший способ выполнить привязку из общего окна служебной программы и самого переднего окна документа?

У меня есть приложение, которое позволяет открывать несколько документов NS. В этом приложении есть одно служебное окно, которое содержит некоторые функции, которые я хочу применить к самому переднему документу.

Я пытаюсь использовать здесь привязки, поэтому фокус в том, как чисто привязать пользовательский интерфейс окна утилиты к самому переднему документу. Цель состоит в том, чтобы затем переключение самого переднего окна документа обновило представление в окне утилиты; элементы управления, привязанные к свойствам модели самого переднего документа, будут обновляться соответствующим образом при изменении состояния в модели документа и т. д.

Для отправки действий из такого окна легко просто использовать первого респондента; объект документа может перехватывать действия через цепочку респондентов. Но я хочу большего, и, конечно же, вы не можете привязаться к первому респонденту.

Несколько идей, которые у меня есть:

  • поместил объектный контроллер в мое перо для общего окна. Когда окно документа меняет статус самого переднего, измените содержимое этой привязки. Недостатком этого является то, что если бы у меня был другой вид служебного окна, я бы не забыл подключить привязки из окна документа к этому служебному окну!
  • Сделайте аксессор в делегате приложения, который будет получать самое переднее окно документа, просматривая список окон. Мое служебное окно будет просто привязано через метод делегата приложения. Недостатком здесь является то, что он не совместим с KVO.
  • Имейте в делегате приложения геттер и сеттер для определения (и, возможно, настройки KVO-совместимости? Имеет ли это смысл?) Самый главный документ. Возможно, используйте оконные уведомления, чтобы установить ivar на соответствующее значение, когда окно теряет основной статус. Обновление: я использую это сейчас, и на самом деле он кажется довольно чистым. Я устанавливаю значение из уведомления windowDidBecomeMain моего окна документа и очищаю его (если это текущее значение) в windowWillClose. Если нет серьезных возражений, я, вероятно, воспользуюсь этим подходом.
  • Одна идея заключалась в привязке к mainWindow.windowController.document ... это идет close, за исключением того, что когда мое общее окно становится главным, эта привязка исчезает. Так что мне действительно нужно найти контроллер самого переднего окна document (и нужного класса).

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


person danwood    schedule 21.10.2008    source источник


Ответы (5)


Я всегда связывался через общее приложение mainWindow.document, которое отлично работает. если у вас есть окна без документов, вы можете добавить mainYourKindOfWindow ключ, который реализуется путем просмотра mainWindow и обновления значения на основе некоторых критериев фильтрации.

person Ben Stiglitz    schedule 22.10.2008
comment
Проблема в том, что при главном окне утилиты. Я хочу, чтобы переднее окно документа находилось под окном служебной программы. - person danwood; 22.10.2008
comment
В этом случае вы не можете использовать это или предложение Питера о просмотре - [NSDocumentController currentDocument]. Наблюдайте за главным окном вашего приложения и установите какое-нибудь свойство NSApplication, за исключением случая, когда ваше служебное окно становится передним. - person Ben Stiglitz; 23.10.2008
comment
При этом есть ли причина, по которой вы не используете здесь NSPanel? - person Ben Stiglitz; 23.10.2008

TextEdit Leopard делает это за своего инспектора. Проверьте это в файле: /// Developer / Examples / AppKit / TextEdit.

person Ken    schedule 23.10.2008

  • поместил объектный контроллер в мое перо для общего окна. Когда окно документа меняет статус самого переднего, измените содержимое этой привязки.

Для меня это имеет смысл. Вы бы изменили содержимое экземпляра документа ([NSDocumentController currentDocument]).

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

Хм? Я этого не понимаю.

person Peter Hosey    schedule 22.10.2008
comment
Чтобы уточнить: если я добавил другое общее окно, очень похожее на то, с которым я работаю, тогда мне нужно будет установить еще одну привязку в документе к этому новому окну. Это просто добавляет сложности. - person danwood; 22.10.2008
comment
Зачем нужна привязка в документе к окну утилиты? Для чего документ должен взаимодействовать с окном утилиты? - person Peter Hosey; 22.10.2008

TextEdit Leopard делает это за своего инспектора. Проверьте это в> файле: /// Разработчик / Примеры / AppKit / TextEdit.

В TextEdit значения инспектора связываются через промежуточный контроллер объекта. Объект содержимого контроллера привязан к mainWindow общего приложения.

Вы можете привязать содержимое к mainWindow.firstResponder и снять флажок «Повышает для неприменимых ключей».

person Community    schedule 11.04.2009

Используйте ключевое окно, а не главное окно. KVO может не поддерживаться для свойства keyWindow NSApplication, но вы все равно можете использовать NSNotifications, если оно не работает. Причина этого в том, что currentDocument NSDocumentController использует keyWindow, поэтому он лучше представляет встроенную функциональность. Кроме того, панели можно настроить так, чтобы они не становились ключевым окном.

person ughoavgfhw    schedule 14.12.2010