Xcode で最低限の(何もしない)ウィンドウを表示するまでの手順
Swift で最小構成の Cocoa アプリを作る場合の手順を忘備録として記録.
Cocoa プロジェクトつくる
- 製品名,組織名,組織識別子,言語(Swift) を設定
- storyboardは使わない
- Document-based Application にはしない
- Core Data は使わない
プロジェクトにウィンドウコントローラを追加(MainWindowController.swift)
- import Foundation を import Cocoa にする
- Cocoaをimportすると3つのフレームワークへアクセスできる
- Foundation, AppKit, CoreData
- このうち AppKit が重要.なぜならそれが Cocoa の U/I を提供するため
- ウィンドウコントローラの新規クラスを作る.アプリのウィンドウを制御するに使用する
class MainWindowController : NSWindowController { }
空のXIBファイルを追加(MainWindowController.xib)
- User Interface の中の Empty を選択
- ウィンドウコントローラとXIBファイルを同じ名前にする必要は必ずしもない
空のXIBファイルにウィンドウを追加する
- アプリとUIとの間を仲介するオブジェクト階層が必要で,そのルートがウィンドウオブジェクト
- 画面右下のリストから window を選択して配置
- 配置するとIDE内のドキュメントアウトラインにWindow, View の2つが追加される
追加したウィンドウの設定を変更する
- Title を変更する
- Visble at Launch のチェックを外す
- 残すとコードの複製が作られ,ウィンドウコントローラと本来表示すべきウィンドウとの関係がマスクされる
- 残しても問題ない.しかしシートを使う場合は例外
アプリ起動時に AppDelegate でウィンドウコントローラのインスタンスを生成してウィンドウを表示する
- ウィンドウコントローラを保持するプロパティを追加
var mainWindowController : MainWindowController?
- ウィンドウコントローラのインスタンスを生成する
func applicationDidFinishLaunching(aNotification: NSNotification) { // ウィンドウコントローラの生成 let mainWindowController = MainWindowController() // ウィンドウの表示 mainWindowController.showWindow(self) // ウィンドウコントローラをAppDelegateのプロパティへセット self.mainWindowController = mainWindowController }
ここまでを整理
- プロジェクトが作成された
- ウィンドウコントローラとウィンドウのクラス定義を用意した
- アプリ起動時にウィンドウコントローラのインスタンスが生成され,showWindow が呼び出された
- まだできていないこと
- ウィンドウが表示されない.ウィンドウコントローラの window アウトレットにウィンドウがセットされていない.
ウィンドウコントローラとウィンドウを接続する
- MainWindowController は NSWindowController から window アウトレットを継承する
- コントローラは自分でウィンドウを作らないため,通常 NIB ファイルから取得する
- NIB ファイルは最初に windowプロパティへアクセスされるタイミングで,nil の場合にロードされる
- showWindow呼び出しでwindowプロパティアクセスが発生する
- NIB ファイルがロードされるためには,コントローラが NIBファイルの名前を知らなければならない
- MainWindowController.swift で, windowNibName を override する
override var windowNibName : String? { return "MainWindowController" }
- MainWindowController が NIBファイルをロードすると,ウィンドウオブジェクトが展開される
- ロードはするが,windowアウトレットはセットされない
- windowアウトレットを NIBファイル内のウィンドウにセットするためにIBを使用する
- File's Ownerプレースホルダーを使う
- IB で File's Owner の Identity インスペクタを開き,クラス名を MainWindowController にする
- これで window アウトレットが IB から見えるようになる
- プレースホルダーの File's Owner 右クリック -> window アウトレットとウィンドウをドラッグ操作により接続する