Приложение на основе документа какао с общими окнами?
Я разрабатываю приложение на основе документов. Каждый документ имеет три окна (и, следовательно, три оконных контроллера). Я хотел бы настроить его так, чтобы два из трех окон были общими для разных открытых документов (при необходимости меняя представления). Это возможно? Кто-нибудь может указать мне правильное направление (документация или примеры)?
Спасибо!
3 ответа
В этом случае эти контроллеры общего окна не должны принадлежать какому-либо документу (поскольку каждый документ будет иметь свою собственную пару "общих" окон), но должны быть независимыми, вероятно, принадлежать делегату приложения или контроллеру документа. Вы также можете сделать панели окон, как инспектор.
Вы захотите, чтобы каждый контроллер отслеживал, какое окно является основным, и обновлял свое окно соответствующим образом при изменении основного окна, поскольку новое главное окно может иметь другой документ.
Практически любой урок о том, как сделать окно инспектора, поможет вам здесь.
Похоже, вам нужно переопределить -makeWindowControllers
в вашем NSDocument
подкласс для создания контроллеров, которые вы хотите, вызывая -addWindowController:
на подкласс NSDocument, чтобы добавить ваши общие контроллеры окна.
Мне еще не приходилось это делать, но это те методы, на которые я бы посмотрел.
Из справочника Apple по NSDocument:
makeWindowControllers
Подклассы могут переопределить этот метод для создания начальных оконных контроллеров для документа.
- (void)makeWindowControllers
обсуждение
Реализация базового класса создает объект NSWindowController с windowNibName и с документом в качестве владельца файла, если windowNibName возвращает имя. Если вы переопределяете этот метод для создания своих собственных контроллеров окон, обязательно используйте addWindowController: чтобы добавить их в документ после их создания.
Этот метод вызывается методами open... NSDocumentController, но в некоторых случаях вы можете вызывать его напрямую.
Это возможно, но это займет нетривиальный объем работы с вашей стороны. В итоге вот что вам нужно сделать:
- Override
setDocument:
в контроллере окна и поддерживать связи, которые он имеет с каждым документом. - Убедитесь, что каждый оконный контроллер (
NSWindowController
) отсоединяется от документа до закрытия окна. То же самое касается каждого контроллера представления, который может обрабатывать представления внутри окна. - Подкласс контроллера документа (
NSDocumentController
) и позаботьтесь о закрытии документа, чтобы убедиться, что окна для нескольких документов отсоединены от документов до того, как какой-либо из документов будет закрыт.NSDocumentController
является единственным, и поэтому вам нужно добавить экземпляр в вашMainMenu.xib
файл для замены по умолчанию.
Вы можете прочитать мое пошаговое руководство о том, как добавить поддержку контроллеров окон с несколькими документами здесь.