Какой хороший способ привязки из общего окна утилиты и самого верхнего окна документа? - PullRequest
12 голосов
/ 22 октября 2008

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

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

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

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

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

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

Ответы [ 5 ]

4 голосов
/ 22 октября 2008

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

3 голосов
/ 23 октября 2008

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

0 голосов
/ 14 декабря 2010

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

0 голосов
/ 11 апреля 2009

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

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

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

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

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

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

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

...