Инициализация другого окна с помощью раскадровки для OS X
Я создал приложение Cocoa в Xcode6, в котором используются раскадровки. В качестве шаблона Xcode предоставляет окно для приложения. Я хочу добавить второе окно, чтобы показать, когда программа загружена впервые. Таким образом, в основном появятся два окна.
Я установил оконный контроллер на Main.storyboard, где также находится первое окно. Тем не менее, я не мог найти способ показать это второе окно при запуске программы. Не могли бы вы помочь?
Спасибо.
Ответы
Ответ 1
В вашей раскадровке выберите второй контроллер окон. В инспекторе идентификации укажите имя этого оконного контроллера, например, secondWindowController
Затем в вашем делете приложения настройте свойство для оконного контроллера:
@property NSWindowController *myController;
В вашей реализации applicationDidFinishLaunching: создайте ссылку на раскадровку. Таким образом вы получаете доступ к вашему оконному контроллеру из раскадровки.
После этого осталось только отобразить окно, отправив вашему оконному контроллеру метод showWindow:.
#import "AppDelegate.h"
@interface AppDelegate ()
@end
@implementation AppDelegate
@synthesize myController;
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
NSStoryboard *storyBoard = [NSStoryboard storyboardWithName:@"Main" bundle:nil]; // get a reference to the storyboard
myController = [storyBoard instantiateControllerWithIdentifier:@"secondWindowController"]; // instantiate your window controller
[myController showWindow:self]; // show the window
}
@end
Ответ 2
Версия Swift 3:
var myWindowController: NSWindowController!
override init() {
super.init()
let mainStoryboard = NSStoryboard.init(name: "Main", bundle: nil)
myWindowController = mainStoryboard.instantiateController(withIdentifier: "myWindowControllerStoryboardIdentifier") as! NSWindowController
myWindowController.showWindow(self)
}
Убедитесь, что вы внедрили myWindowController
вне функции, иначе окно не будет отображаться.
На самом деле лучше сделать это в init() (AppDelegate), как вам может понадобиться раньше.
Ответ 3
версия swift 4:
var monitorcontroler: NSWindowController!
override init() {
super.init()
let mainStoryboard = NSStoryboard.init(name: NSStoryboard.Name(rawValue: "Main"), bundle: nil)
monitorcontroler = mainStoryboard.instantiateController(withIdentifier: NSStoryboard.SceneIdentifier(rawValue: "moniteur")) as! NSWindowController
monitorcontroler.showWindow(self)
}
Ответ 4
Swift 5:
Настройка проекта в XCode 13 полностью изменилась. Больше нет примера того, как подключиться к раскадровке из AppDelegate. Вместо этого они жестко кодируют NSWindow. Я все еще нахожу раскадровки полезными, поэтому нижеприведенное должно пригодиться. Не забудьте назвать свой WindowController в раскадровке как mainWindowController
.
let mainStoryboard = NSStoryboard.init(name: NSStoryboard.Name("Main"), bundle: nil)
var monitorcontroler = mainStoryboard.instantiateController(withIdentifier: NSStoryboard.SceneIdentifier("mainWindowController")) as! NSWindowController
monitorcontroler.showWindow(self)