По сути, в вашей NIB вы создаете различные окна, добавляете свои кнопки, текстовые поля и т. Д. Затем вы добавляете пользовательский объект, который действует как «контроллер», который отправляет и получает сообщения в окна и из окон и различные элементы управления. В простом проекте вы можете использовать автоматически созданный объект AppDelegate для управления вашими окнами, для больших проектов вы хотите, чтобы отдельный объект обрабатывал логику, которая может быть экземпляром NSObject или NSWindowController, в зависимости от ваших потребностей.
Windows может быть настроена как «Видимая при запуске», которая открывает их при запуске приложения. Вы также можете открыть их вручную, создав ссылки IBOutlet в заголовочных файлах и подключив их в NIB. Чтобы показать окна, вы отправляете им сообщение makeKeyAndOrderFront:
. Чтобы закрыть их, вы отправляете им метод close
.
Чтобы ответить на открытие / закрытие окна, вы назначаете свой объект контроллера как «делегат» окна, что означает, что он будет получать сообщения от окон, которые перечислены в документации по протоколу NSWindowDelegate. Поэтому, если вы хотите открыть окно в ответ на закрытие другого окна, вы должны прослушать сообщение windowWillClose:
и сказать открыться другому окну, и наоборот.
Это довольно простой материал, поэтому я рекомендую вам прочитать книгу Hillegass или просмотреть некоторые из учебных пособий доступных онлайн .
EDIT:
Ваше приложение аварийно завершает работу, поскольку для вашего другого окна установлено значение «Выпуск при закрытии». Поскольку вы находитесь в среде управления памятью, и окно не удерживается, при следующей попытке открыть его оно уже было освобождена. Решением является снятие флажка «Выпуск при закрытии» в файле NIB. Обратите внимание, что вы также можете подключить действия кнопок к методам makeKeyAndOrderFront:
и performClose:
самого другого окна непосредственно в NIB.