Подтвердить что ты не робот

Инициализация другого окна с помощью раскадровки для OS X

Я создал приложение Cocoa в Xcode6, в котором используются раскадровки. В качестве шаблона Xcode предоставляет окно для приложения. Я хочу добавить второе окно, чтобы показать, когда программа загружена впервые. Таким образом, в основном появятся два окна.

Я установил оконный контроллер на Main.storyboard, где также находится первое окно. Тем не менее, я не мог найти способ показать это второе окно при запуске программы. Не могли бы вы помочь?

Спасибо.

4b9b3361

Ответ 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)