2つのウィンドウを持つOS Xアプリ

カテゴリ:  Tech タグ:  osx programming swift xcode

2つのウィンドウを持つ場合のStoryboardの使い方がわからなかったのでまとめてみました。

2つ目のViewControllerを用意する。

メインウィンドウにあるボタンを押すと、2つ目のウィンドウが現れるようなアプリケーションを作ってみます。

StoryBoardを開いて、2つ目のViewControllerを作ります。WindowControllerでないとところが注意店です。

StoryBoard

StoryBoard

ここでは「Push Me」ボタンのアクションを受けるので、ボタンのactionから2つ目のViewControllerをつなぎ、Modalを選択します。ここでSheetやPopoverを選択すると現れ方が変わります。

2つ目のViewにはラベルと閉じるためのボタンを配置しておきます。

View間を受け渡すオブジェクトを作る。

View間でデータを受け渡したいのですが、お互いに参照を持っていないので困りました。

「Push Me」ボタンを押して、Modalで2つ目のViewを開く時 prepareForSegue()が動き、ここで参照が渡ってくるのでこの参照を利用します。以下のようにprepareForSegueをオーバーライドし、segueのdestinationControllerをキャストしてSecondViewControllerの参照を取得します。

今回はMessageというクラスを作ったので、このオブジェクトのrepresentaedObjectとしてセットします。

//ViewController.swift

override func prepareForSegue(segue: NSStoryboardSegue, sender: AnyObject?) {
    let secondViewController = segue.destinationController as SecondViewController
    secondViewController.representedObject = aMessage
}

ViewControllerクラスを作る。

次に2つ目のViewControllerに対応するNSViewControllerから派生したクラスを作ります。 init()のオーバーライドは必要そうなんで追加しました。StoryBoardのIdentify Inspectorで

まず、2つ目のViewを閉じた時のアクションを追加します。 StoryBoardのCloseボタンから SecondViewControllerのコードエディタにドラッグして@IBAction を作ります。ここではdismiss()としています。

// SecondViewController

required init?(coder: (NSCoder!)) {
    super.init(coder: coder)
}

@IBAction func dismiss(sender: AnyObject) {
    self.dismissController(self)
}

次にラベル用のOutletを作ります。StoryboardからコードエディタにLabelをドラッグします。 そして、representedObjectで渡ってきたMessageオブジェクトからテキストをセットします。セットするのはViewが開かれる際に呼び出されるviewWillAppear()をオーバーライドします。

// SecondViewController.swift

@IBOutlet weak var aLabel: NSTextField!

override func viewWillAppear() {
    let aMessage = self.representedObject as Message
    aLabel.stringValue = aMessage.message
}

GitHub: yostos/TwoWindows

コメント

Comments powered by Disqus