メモ書き

自分が後で見直すためにつけている作業のメモ書きです.それ以上の意味はありません

Xcode で最低限の(何もしない)ウィンドウを表示するまでの手順

Swift で最小構成の Cocoa アプリを作る場合の手順を忘備録として記録.

参考

www.amazon.co.jp

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 のチェックを外す
    • 残すとコードの複製が作られ,ウィンドウコントローラと本来表示すべきウィンドウとの関係がマスクされる
    • 残しても問題ない.しかしシートを使う場合は例外

テンプレートが MainMenu.xib に自動生成したウィンドウを削除する

  • 同時に AppDelegate.swift に生成した windowプロパティも削除する

アプリ起動時に 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を使用する
  • IB で File's Owner の Identity インスペクタを開き,クラス名を MainWindowController にする
    • これで window アウトレットが IB から見えるようになる

  • プレースホルダーの File's Owner 右クリック -> window アウトレットとウィンドウをドラッグ操作により接続する

ビルドして実行