これまで、主にコマンドラインツールを作成してきた。
ある程度、Objective-C の様子もわかったきたと思うので、GUI アプリの作成に手をつけてみよう。
プロジェクトの作成〜実行
Xcode を起動して新しいプロジェクトをつくる。

Command Line Tool ではなく、App の方を選ぶ。
次に Product Name などを決めるダイアログが出現する。

ワイは cocoa-sample としたが、名前などは適当に。
言語は Objective-C で。
悩みどころは、interface の選択で、いくつか候補はある。
アップルのアプリの GUI に関しては、歴史的には、 Nib → Xib → Storyboard → SwiftUI の順番で発展してきた。
(ただし、現状では開発言語を Objective-C を選択した場合は SwiftUI は選べない。なお、Nib は Next Interface Builder から。Xib の X は XML から)
iOS の影響なのか Storyboard で説明してあるサイト・教科書がほとんどだが、今でもレガシーなプロジェクトでは Xib は使われている。さすがに Nib は見かけないが。
GUI のシステムは度々変更されるので、表面的な操作だけではなく、その意味を把握することを意識しておくと少々の変更があっても対応することができると思う。
プロジェクトを作成するといくつかのファイルが自動生成される。
いきなりだが、この時点で run させてみよう。
ここまでの手順が間違ってなければ、以下のようなウィンドウが出現する。

ここまで1行のコードも書かずに Mac ネイティブなウィンドウをディスプレイ上に表示できているわけだから、世間的にはこちらの流儀がメインとなっていくのはわからないでもない。
しかし、である。
知識や理解などがこのレベルに留まっている人は多いようだ。
このレベルだと狙った機能を独自に実装する、というような作業は無理ではなかろうか。
自動生成されたファイルなどの意味をもう少々深掘りしよう。
main.m の意味
main.m の具体的なコードは以下のようになっている。
#import <Cocoa/Cocoa.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
// Setup code that might create autoreleased objects goes here.
}
return NSApplicationMain(argc, argv);
}
GUI メインで学んできた初学者に「argv って何?」と聞いてもうまく答えられる人はそう多くない。
ワイがまず最初にコマンドラインツールやらポインタの説明をしたのは、ここら辺の理解を深めるためってのもある。
要するにこのコードは argc と文字列配列(のポインタ)argv を NSApplicationMain() に与え、そこからの返り値を待っているという機能をになっている。
では、NSApplicationMain が何かといえば、アプリケーションを管理しているクラスを呼び出す関数ということになる。
ここら辺は日本語記事もあるし、アップル公式の説明でもなんとかなると思う。

ところで、初学者にどの程度まで説明するのか?というのは難しい問題も孕んでいる。
NSApplicationMain にしても、「NS は NextStep に由来する」のようなマメな知識をさしはさんでいるサイトはあるが、「Objective-C/C++ では名前空間の概念がないため、クラスやそのメンバー関数を命名する際には慣例的に大文字2文字を先頭につける」といったところまで説明しているサイトはほぼない。
AppDelegate と ViewController
だんだん理解があやしくなってくるのが、AppDelegate や ViewController だろう。

ただ、ちょっと先を急ぎたいので、ここはワイも流させてもらう。
あるアプリが main.m を経て NSApplicationMain で示される何かで管理されているとき、全てが管理されていたのでは、独自実装はできなくなってしまうので、動作の要所要所で独自処理を指示できる箇所が AppDelegate だ、という説明ではどうだろう?
WindowController
cocoa アプリのプロジェクトを作成したとき、AppDelegate と ViewController に対応するファイルは自動で生成される。
が、実際にウィンドウシステムを動作させるとき、これを管理するクラスも必要だ。
結論から先に書くと、これが WindowController クラスで、Xcode 上でも確認できる。
Main.storyboard を選んだ際、これを構成する Scene が表示されるが、Window Controller はしっかりありますよね?
ファイルでは生成されないのだが、裏では動いているという理解でいいと思う。
そのほか
そのままでは機能はしないが、メニュー構造もできている。
つまり、プロジェクトを作成しただけでも、デスクトップアプリに必要な機能はほぼ提供されているのだ。
(続く)



“Xcode で GUI アプリ” への1件の返信