Подтвердить что ты не робот

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

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

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

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

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

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

Ответ 3

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

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

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

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

Ответ 4

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

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

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

Ответ 5

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