Уточнение понимания NSWindowController

Я несколько раз использовал NSWindowController в проектах и ​​чувствую, что имею (очень) приблизительное представление о концепциях, лежащих в основе этого важного класса. Что я хотел бы сделать с этим постом, так это прояснить / исправить мое собственное понимание и, надеюсь, помочь другим учащимся сделать этот первый шаг к пониманию. Я считаю наиболее полезными краткие концепции, обзор и передовые методы, и часто отсутствует в документации. Вот мой взгляд на NSWindowController (вопросы выделены жирным шрифтом):

  • Подкласс NSWindowController (NSWC) существует (концептуально) непосредственно под каждым кончиком окна, действуя как связующее звено между элементами пользовательского интерфейса и объектами модели, которые они контролируют / представлять. По сути, каждое окно в вашем приложении должно иметь свой собственный подкласс NSWC.
  • Владелец файла пера всегда должен быть подклассом NSWC. Это так даже для приложения MainMenu.xib?
  • Свойство NSWC window всегда должно быть связано с NSWindow в InterfaceBuilder.
  • Вы должны переопределить метод 'init', используя [super initWithWindowNibName:] , чтобы при обращении к [окно mycontroller] загружалось перо. Должно ли это иметь место и для NSWC для окна MainMenu.xib, даже если оно открывается при запуске?
  • NSWC не должен выполнять слишком тяжелую работу - он должен просто передавать сообщения экземплярам объектов , и представить эти объекты в пользовательском интерфейсе.
  • Он может изменять пользовательский интерфейс, используя привязку или выступая в качестве делегата для таблиц и т. д., или путем активного изменения элементов пользовательского интерфейса, когда он наблюдает за изменением, или комбинации любого из выше (какой из них вы используете, кажется, дело вкуса, со всеми плюсами и минусами).
  • NSWC может создавать экземпляры других NSWC при необходимости (например, при открытии одноразового подокна) .
  • Используйте [mycontroller showWindow: nil] для отображения связанного окна спереди. Если вы хотите, чтобы окно отображалось в виде листа, используйте что-то вроде: [NSApp beginSheet: [окно mycontroller] modalForWindow: [собственное окно] modalDelegate: себя didEndSelector: @selector (didEndMySheet: returnCode: contextInfo :) contextInfo: ноль];

didEndSelector: должен быть методом NSWC родительского окна и может получить доступ и освободить mycontroller с помощью [sheet windowController] . - Чтобы закрыть окно, вызовите метод performClose: окна NSWC.

Некоторые вопросы:

  • Должен ли NSWC окна MainMenu также быть делегатом приложения или это должен быть другой класс?
  • В том же духе, должны ли основные файлы NSWC обрабатывать файлы (перетаскивание и открытие), или они должны быть переданы делегату приложения, или это всего лишь вопрос вкуса?

Пожалуйста, поправьте меня, если есть Это плохая практика или просто неправильная. Я хочу прояснить свое понимание NSWindowController, поэтому любые дополнения (в виде передового опыта, опыта, ошибок) будут очень признательны.

Спасибо, Laurie

40
задан Anoop Vaidya 12 May 2013 в 08:24
поделиться