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