Hello Worldのウインドウコントローラクラスを追加する | macOSアプリの作り方

前回のCocoa版Hello World作成の続きです。今回はウインドウコントローラクラスを追加して、Cocoa版Hello Worldで表示されるウインドウのウインドウコントローラを変更する方法について解説します。

この記事では前回の記事で作成したCocoa版Hello Worldのプロジェクト一式を使用します。前回の記事に沿ってプロジェクトを作成している場合は、それを開いてください。作成されていない方は、前回の記事の末尾から、前回の最終状態のサンプルコードをダウンロードできるので、そちらをご利用ください。

目次

ウインドウコントローラとは?

AppKitでのウインドウ制御は、ウインドウと、そのウインドウを管理するウインドウコントローラによって構成されています。ここでMain.storyboardを開いてください。

Main.storyboard
Main.storyboard

スクリーンキャプチャで囲んだ場所に注目してください。次の3つのシーンが入っています。

  • Application Scene
  • Window Controller Scene
  • View Controller Scene

今回、解説するのはWindow Controller Sceneです。Window Controller Sceneのディスクロージャーボタンを開くと、Window Controllerが見つかります。更にWindow Controllerのディスクロージャーボタンを開くと、Windowが見つかります。

このように、WindowはWindow Controllerが管理していて、それをWindow Controller Sceneが管理しています。

Window Controller Sceneを選択し、アトリビュートインスペクタを開いてください。「Is Initial Controller」という項目がオンになっています。「Is Initial Controller」がオンになっているWindow Controller Sceneは、Storyboardファイルが読み込まれたときに、最初に使われるシーンになります。

つまり、Main.storyboardが読み込まれると、Window Controller Sceneが使われて、Window Controller Sceneが管理しているWindow Controllerがロードされ、Window Controllerが管理しているWindowが表示されるという流れになります。

ウインドウコントローラクラスを追加する

AppKitでは、ウインドウコントローラのクラスはNSWindowControllerクラスです。AppKitはウインドウに対して何かしらの操作が行われたり、ウインドウの状態が変更されたりすると、ウインドウを管理するウインドウコントローラクラスのメソッドを実行したり、ウインドウのデリゲートのデリゲートメソッドを呼んだりします。

AppKitのアプリを作るときは、NSWindowControllerクラスのサブクラスを作って、アプリ独自の処理を実装します。

Cocoa版Hello Worldでもウインドウコントローラを作って見ましょう。

クラスの追加

まずは、クラスをプロジェクトに追加します。次のように操作します。

STEP
プロジェクトウインドウのプロジェクトナビゲータでHelloWorldグループを選択します。
STEP
「File」メニューの「New」から「File…」を選択します。
STEP
テンプレートから「macOS」カテゴリの「Cocoa Class」を選択し、「Next」ボタンをクリックします。なお、「Swift File」でも構いません。初期生成されるコードが異なるだけです。
ファイルテンプレート
ファイルテンプレート
STEP
新規ファイルのオプションが表示されます。次のように入力して、「Next」ボタンをクリックします。
設定項目 説明
Class HelloWindowController
Subclass of NSWindowController
Also create XIB file for user interface オフ
Language Swift
新規ファイルのオプション
STEP
保存先設定ダイアログが表示されます。デフォルト値のままで「Create」ボタンをクリックします。
ディレクトリを選択する
ディレクトリを選択する
STEP
NSWindowControllerクラスのサブクラスHelloWindowControllerが作成されます。
import Cocoa

class HelloWindowController: NSWindowController {

    override func windowDidLoad() {
        super.windowDidLoad()
    
        // Implement this method to handle any initialization after your window controller's window has been loaded from its nib file.
    }

}

インスタンス化されるクラスを変更する

Main.storyboardが読み込まれて、Window Controller Sceneが表示されるときに、NSWindowControllerクラスのインスタンスが作成されて、ウインドウが表示されます。

インスタンス化されるクラスを、NSWindowControllerクラスからHelloWindowControllerクラスに変更します。次のように操作します。

STEP
Main.storybordを開きます。
STEP
Window Controller SceneのWindow Controllerを選択します。
STEP
Identityインスペクタを開きます。
Window ControllerのIdentity
Window ControllerのIdentity
STEP
Identityインスペクタで「Class」を「HelloWindowController」に変更する。
クラスの変更
クラスの変更

これで、インスタンス化されるクラスがHelloWindowControllerクラスに変更されます。

サンプルコードのダウンロード

今回の記事で作成したCocoa版Hello Worldはこちらからダウンロードできます。

著書紹介

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

Akira Hayashi (林 晃)のアバター Akira Hayashi (林 晃) Representative(代表), Software Engineer(ソフトウェアエンジニア)

アールケー開発代表。Appleプラットフォーム向けの開発を専門としているソフトウェアエンジニア。ソフトウェアの受託開発、技術書執筆、技術指導・セミナー講師。note, Medium, LinkedIn
-
Representative of RK Kaihatsu. Software Engineer Specializing in Development for the Apple Platform. Specializing in contract software development, technical writing, and serving as a tech workshop lecturer. note, Medium, LinkedIn

目次