Table of Contents
Xcode で macOS 用のアプリ(Cocoa)のプロジェクトを作ると、Storyboard のチェックを外しても xib を使って最初のウィンドウ(NSWindow)を作る設定となっています。
今回は、Storyboard も xib も使わずにコードのみで初期ウィンドウを作成する方法について紹介します。
以下の手順は Cocoa Application のプロジェクトを Storyboard のチェックを外して作成した状態を想定しています。
xibファイルの紐付けを削除
Info.plist のプロパティである「Main nib file base name」を項目ごと削除します。
以上を削除後、プロジェクト内の MainMenu.xib は削除して構いません。
手動でmain関数を編集
ウィンドウをプログラムのみで作成・表示する場合は main関数 を編集する必要があります。
Objective-C の使用時にファイルとして存在していた main関数 を含んだソースファイルは、Swift では @NSApplicationMain によって自動補完されています。
この自動補完の記述を削除して main.swift という名前のSwiftファイルをプロジェクトに追加することで、手動で main関数 を変更することができます。
そこで、まず AppDelegate.swift の @NSApplicationMain を以下の様に削除します。
import Cocoa // @NSApplicationMain (この行を削除またはコメントアウト) class AppDelegate: NSObject, NSApplicationDelegate { var window: NSWindow! func applicationDidFinishLaunching(_ aNotification: Notification) { ...
その後、プロジェクトに main.swift という名前でSwiftファイルを新規作成し、中身を以下のように書き換えます。
import Cocoa let app = NSApplication.shared let delegate = AppDelegate() app.delegate = delegate app.run()
ウィンドウの作成
実際にウィンドウを作成する処理です。AppDelegate 内に NSWindow を作成する処理を以下のように記述します。
import Cocoa class AppDelegate: NSObject, NSApplicationDelegate { var window: NSWindow! func applicationDidFinishLaunching(_ aNotification: Notification) { window.makeKeyAndOrderFront(nil) } func applicationWillFinishLaunching(_ notification: Notification) { // ウィンドウの作成 window = NSWindow(contentViewController: ViewController()) window.title = "New Window" window.center() } // ウィンドウが閉じられたらアプリも終了する func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool { return true } }
NSWindow のインスタンス作成時に紐付けているクラスである ViewController の中身は以下の通りです。
ViewController.swift
import Cocoa class ViewController : NSViewController { override func loadView() { self.view = NSView(frame: NSRect(x: 0, y: 0, width: 300, height: 200)) } override func viewDidLoad() { print("viewDidLoad") } }
ウィンドウ作成時に loadView が呼び出されます。ViewController には、初期状態で view が存在しないため、このメソッド内で作成しています。
これによって view が作成され、メソッド viewDidLoad が呼び出されます。ウィンドウのサイズは、この view に設定したサイズになります。
上記のようにファイルを編集後、プロジェクトを実行すると、以下のようなシンプルなウィンドウが表示されると思います。
以上が Cocoa Application で Storyboard や xib を使わずにウィンドウを作成する方法です。