Я использовал NSWindowController в проектах несколько раз и чувствую, что у меня есть (очень) грубое понимание концепций этого важного класса. То, что я хотел бы сделать с этим сообщением, состоит в том, чтобы уточнить/исправить мои собственные понимания и, надеюсь, помочь другим учащимся получить этот первый шаг к пониманию. Это взглянуть на концепции, обзор и лучшие практики, которые я нахожу, наиболее полезны и часто не хватает в документации. Вот мой подход к NSWindowController (вопросы перемежаются жирным шрифтом):
- Подкласс NSWindowController (NSWC) существует (концептуально) под каждым окном, действуя как клей между элементами пользовательского интерфейса и объектами модели, которыми они управляют/представляют. В принципе, каждое окно в вашем приложении должно иметь свой собственный подкласс NSWC.
- Владелец файла ниба всегда должен быть подклассом NSWC. Это дело даже для приложения MainMenu.xib?
- Свойство NSWC
window
всегда должно быть связано с NSWindow в InterfaceBuilder. - Вы должны переопределить метод init, используя
[super initWithWindowNibName:]
, так что, когда вы обратитесь к[mycontroller window]
, он загрузит nib. Если это также относится к NSWC для окна MainMenu.xib, даже если это открыто при запуске? - NSWC не должен делать слишком много тяжелой работы - он должен просто передавать сообщения экземплярам объектов и представлять эти объекты в пользовательском интерфейсе.
- Он может изменять пользовательский интерфейс, используя привязку, или действовать как делегат для таблиц и т.д., или активно изменять элементы пользовательского интерфейса при наблюдении за изменением или комбо из любого из вышеперечисленных (который вы используете, по-видимому, вопрос вкуса, с плюсами и минусами со всех сторон).
- NSWC может создавать экземпляры других NSWC при необходимости (например, при открытии одноразового под-окна).
-
Используйте
[mycontroller showWindow:nil]
, чтобы отобразить соответствующее окно спереди. Если вы хотите, чтобы окно отображалось как лист, используйте что-то вроде:NSWindowController* mycontroller = [[MyController alloc] init]; [NSApp beginSheet: [mycontroller window] modalForWindow: [self window] modalDelegate: self didEndSelector: @selector(didEndMySheet:returnCode:contextInfo:) contextInfo: nil];
didEndSelector:
должен быть методом NSWC родительского окна и иметь доступ и освобождать "mycontroller" с помощью [sheet windowController]
.
- Чтобы закрыть окно, вызовите метод performClose:
окна NSWC.
Некоторые вопросы:
- Если NSWC окна MainMenu также является делегатом приложения или должен быть другим классом?
- В том же ключе, должны ли главные файлы управления NSWC (перетаскивание и открытие), или должны быть переданы делегату приложения, или это просто вопрос вкуса?
Пожалуйста, исправьте меня, если какая-либо из этих причин является плохой практикой или просто неверна. Я хочу разъяснить свое понимание NSWindowController, поэтому любые дополнения (в виде передового опыта, опыта, gotchas) будут высоко оценены.
Спасибо, Laurie