2つのウィンドウを持つOS Xアプリ
2つのウィンドウを持つ場合のStoryboardの使い方がわからなかったのでまとめてみました。
2つ目のViewControllerを用意する。
メインウィンドウにあるボタンを押すと、2つ目のウィンドウが現れるようなアプリケーションを作ってみます。
StoryBoardを開いて、2つ目のViewControllerを作ります。WindowControllerでないとところが注意店です。
ここでは「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クラスを作る。
次に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()をオーバーライドします。