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

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

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

関連記事

はじめてのmacOSアプリとして、Cocoa版のHello Worldの作り方を解説します。今回はコーディングゼロで、Storyboardの編集だけでHello Worldを作ります。 この記事ではXcodeを使用します。Xcod[…]

スポンサーリンク

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

AppKitでのウインドウ制御は、ウインドウと、そのウインドウを管理するウインドウコントローラによって構成されています。ここで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でもウインドウコントローラを作って見ましょう。

クラスの追加

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

(1) プロジェクトウインドウのプロジェクトナビゲータでHelloWorldグループを選択します。

(2) 「File」メニューの「New」から「File…」を選択します。

(3) テンプレートから「macOS」カテゴリの「Cocoa Class」を選択し、「Next」ボタンをクリックします。なお、「Swift File」でも構いません。初期生成されるコードが異なるだけです。

(4) 新規ファイルのオプションが表示されます。次のように入力して、「Next」ボタンをクリックします。

設定項目 説明
Class HelloWindowController
Subclass of NSWindowController
Also create XIB file for user interface オフ
Language Swift

(5) 保存先設定ダイアログが表示されます。デフォルト値のままで「Create」ボタンをクリックします。

(6) 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クラスに変更します。次のように操作します。

(1) Main.storybordを開きます。

(2) Window Controller SceneのWindow Controllerを選択します。

(3) Identityインスペクタを開きます。

(4) Identityインスペクタで「Class」を「HelloWindowController」に変更する。

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

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

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

002_CocoaHelloWorld.zip

スポンサーリンク
最新情報をチェックしよう!