Как сделать так, чтобы два окна всплывали в начале приложения Swift 4 Cocoa?

Я работаю над проектом Swift 4 Cocoa Mac OS X (не iOS) с XCode 9. У меня есть два NSWindow в моей основной раскадровке с разными (подклассами) NSViews. В настоящее время только одно окно содержит точку входа в раскадровку, поэтому другое не появляется при запуске приложения, и я хочу, чтобы оба окна появлялись при загрузке приложения.

Я пробовал гуглить с разными ключевыми словами, но пока не смог найти способ. Единственный способ, который я нашел, заключался в том, чтобы подключить переход от кнопки или меню в одном окне к другому окну, чтобы другое окно появлялось при каждом нажатии кнопки. Есть ли способ сделать оба окна вначале «правильным способом» (предпочтительно с использованием функций раскадровки XCode)?


person Jineon Baek    schedule 08.11.2018    source источник
comment
Пробовали ли вы руководство? Окна на самом деле не элементы. Учебник проведет вас через базовое использование представлений, которые могут помочь вам записать ваши реальные требования.   -  person Efren    schedule 08.11.2018
comment
Спасибо за ваш вклад. Теперь я вижу, что мне нужно изучить точные структуры приложения (что именно делает класс, как классы взаимодействуют друг с другом и т. д.).   -  person Jineon Baek    schedule 08.11.2018
comment
@Efren Будет ли нормально просматривать учебные пособия / ресурсы для iOS, чтобы понять программирование Mac OS Cocoa? Когда я начал учиться, я пропустил упомянутый вами учебник, потому что он был для iOS, но теперь у меня сложилось впечатление, что они очень похожи.   -  person Jineon Baek    schedule 08.11.2018
comment
@Efren И, если не возражаете, можете порекомендовать какие-нибудь ресурсы для понимания структуры приложения Cocoa именно для новичка? Я займусь поиском, но ресурсы, которые я видел в Интернете, либо плохо описывают внутреннюю механику, либо слишком технические, чтобы их можно было переварить (при условии предварительного понимания классов Cocoa).   -  person Jineon Baek    schedule 08.11.2018
comment
@Efren Извините, если я задал слишком много вопросов, и, пожалуйста, не чувствуйте себя обязанным отвечать - возможно, я смогу задать другие вопросы в stackoverflow. Еще раз спасибо за ссылку!   -  person Jineon Baek    schedule 08.11.2018
comment
Да, документы, к сожалению, в основном не обновляется до Swift. Этот список может помочь, в частности < href="https://www.raywenderlich.com/704-macos-view-controllers-tutorial" rel="nofollow noreferrer">пункт 5. Этот последний веб-сайт, в частности, очень помог мне с пробелами iOS в документе, хотя некоторые страницы могут быть с предыдущими версиями Swift.   -  person Efren    schedule 08.11.2018


Ответы (1)


Вы должны получить ссылку на оконный контроллер в вашей раскадровке из второго окна, которое вы хотите показать. Добавьте этот код в свой NSApplicationDelegate в applicationDidFinishLaunching. Не забудьте установить идентификатор из WindowController в раскадровке

let storyboard = NSStoryboard(name: "Main", bundle: nil)
let windowController = storyboard.instantiateController(withIdentifier: "MyWindowController") as! NSWindowController
windowController.showWindow(self)
person Marc T.    schedule 08.11.2018
comment
Это работает как шарм. Пройдемся по документации о том, что происходит позади. Спасибо! - person Jineon Baek; 08.11.2018
comment
Я думаю, стоит добавить: поскольку мы добавляем контроллер из основной раскадровки, нам не нужно создавать экземпляр другой раскадровки с именем main и просто выполнять NSStoryboard.main!.instantiateController вызов. - person Jineon Baek; 08.11.2018
comment
Но теперь я задаюсь вопросом, хорошо ли, чтобы два появляющихся окна находились в одной и той же «основной» раскадровке. Хорошо это или нет, зависит от каждой ситуации. При использовании другой раскадровки мы должны вручную создать экземпляр объекта NSStoryboard. - person Jineon Baek; 08.11.2018
comment
Для вашего первого вопроса, конечно, вы можете сделать это и с main, но я хотел обрисовать в общих чертах, как мы можем ссылаться на любую раскадровку в проекте. Это зависит от вас и от того, хотите ли вы, чтобы все ваше окно было в одной или нескольких раскадровках. Обычно я использую разные раскадровки для каждого окна. (Например, «Настройки», «О панели»). В конце они окажутся в отдельных xib-файлах, независимо от того, как вы их организуете. - person Marc T.; 08.11.2018