Objective-CでiOSアプリの第二歩 とにかく立ち上がればというレベルのHello, World!アプリを作成
公開日:
:
iOSアプリを書く! Objective-C, UIKit, Xcode
前回はiOSアプリ作成の第一歩として、Empty Applicationを選択した際に書いてあるコードについてその役割を確認した。今回は、簡単なHello, World!表示アプリケーションのiOS版を作ってみたい。
さて、iOSアプリケーションの場合、OSXのコンソールアプリケーションでの場合と異なり、標準出力を引き受けて自動的に表示してくれる部分がない。そこで、”Hello, World!”をデバイス上に表示してくれる仕組みについて考えなければならないだろう。ということで、iOSアプリケーションの作成で必ず通らなくてはいけない道、UIViewとUIViewControllerについて勉強しつつ、仕組みを作っていこう。
UIViewとUIViewControllerとは?
UIViewとUIViewControllerは、いずれもUIKitの中で宣言がされているクラスである(それぞれUIView.hとUIViewController.hというファイルがある)。この2つのクラスは、両方ともUIResponderというクラスを継承しており、UIResponder自体は全てのオブジェクトの大元であるNSObjectを継承している。したがって、NSObjectの孫世代ということになる。
親のUIResponderがどういうクラスなのかというと、名前の通りユーザのタッチやドラッグ、デバイスのシェイクといったイベントを検知して、そこにフックして処理を書くことが出来るようになっているものだ。iOSアプリケーションのボタンやらスライダーやらのGUI部品がタッチなどのイベントに反応してくれるのは、このUIResponderを祖先に持っているからである。もしUIResponderと赤の他人であったとしたなら、タッチなどのイベントに対して不感症にならざるを得なかっただろう。そういったクラスだ。
今例に挙げたボタンやらスライダーやらは、UIViewの血筋を引いている。このUIViewというのが、つまりボタンやらスライダーに代表されるような、目に見えるGUI部品の総称である。一方UIViewControllerというのは、そのGUI部品の集合を載せる器のようなもので、「器にこの食材(UIView)を乗せて下さい」や、「器ごと料理の向きを変えて下さい」「この料理、器ごとおろしちゃって下さい」というような命令を引き受け処理を行う。その他にも、面倒臭いことを一手に引き受ける優秀なクラスのようだけれど、今回のアプリケーションは意図的にこれを無視して作ってみようと思う。
UIViewのaddSubViewメソッド
前回眺めたコードで、アプリケーションが立ち上がったタイミングでUIWindowのインスタンスを1つ作成し、AppDelegateクラスのwindowプロパティに代入していた。このUIWindowもUIViewの子クラスであり、UIViewに存在するaddSubViewというメソッドが使用できる。addSubViewの機能は、UIViewクラスないしその子孫クラスのインスタンスを引数として受け取り、それを呼び出したビューの上に表示してくれるというもの。このメソッドにUILabelという文字表示を担当するGUI部品を与えれば、”Hello, World!”などの定型文表示が出来そうだ。AppDelegate.mのapplicationメソッドをオーバーライドしている部分に、次のように加える。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; // Override point for customization after application launch. self.window.backgroundColor = [UIColor whiteColor]; /* こっから */ UILabel* helloLabel = [[UILabel alloc] initWithFrame:CGRectMake(10, 10, 100, 100)]; helloLabel.text = @"Hello, World!"; [self.window addSubview:helloLabel]; /* ここまで */ [self.window makeKeyAndVisible]; return YES; } |
UILabelクラスのインスタンスhelloLabelを作成し、initWithFrameという初期化処理でビュー内での位置とサイズを与えている。
initWithFrameメソッドは、CGRect型の引数を受ける。CGRectMakeというグラフィックライブラリのインライン関数が用意されており、引数でx軸左上からの距離、y軸左上からの距離、幅、高さといった順で与えることで、CGRect型を返してくれる。
UILabelに描かれるテキストは、textプロパティに代入することになる。textプロパティはNSString型を受ける。NSStringは@の後に文字列を書く指定方式だった。
最後にUIWindowのaddSubViewメソッドでウィンドウ上にUILabelを追加・表示する。
これで完成、iOSシミュレータで実行するときちんと”Hello, World!”と表示されている。
view controllerを無視すると警告が出る
上のアプリケーション(と言えるかはわからないが)はエラーも無く動いているのだが、シミュレータを終了するとデバッグコンソールに警告が出ている。”Application windows are expected to have a root view controller at the end of application launch”というメッセージ。アプリケーションウィンドウにはルートとなるview controllerが設定されていてほしいというものだ。
Objective-Cと最低限のライブラリを使った記述的に、上のアプリケーションは間違っていないのだが、iOSアプリケーションとしてはルールを守れていないという警告である。そこで、iOSアプリケーションとしての不都合が出ないように、UIViewControllerを引っ張り出してきてrootViewControllerに指定するというように、コードを冗長にしなければならない。
UIViewControllerはiOS側に頼まれて仕方なく実装するという所がポイント。iOSプログラミング入門書のHello, World!では、そこをすっとばして最初からUIViewControllerが必要ですねとなっているので分かりにくいわけ。
関連記事
-
iOSプログラミング入門書では、まず最初のHello, World!すら難しい
Hello, World!が第一歩 新しくプログラミング言語を習得するときに、「この言語でのH
-
Objective-Cの第五歩 クラスの継承とメソッドのオーバーライド
前回Objective-Cの第四歩では、等差数列の和を計算するプログラムGaussTesterの作成
-
Objective-CでiOSアプリの第一歩 新規プロジェクトで生成されるコードの解説
しけたコンソールアプリばかり作っていたけれど、ようやっとiOSプログラミングに入るとしよう。急がない
-
Objective-Cでは何故.hファイルと.mファイルを作成させられるのか
前回説明したように、Objective-Cでプログラムを書く際には、別にC言語そのもののつもりで書い
-
Objective-Cの第六歩 プロトコルの宣言と実装
Objective-Cの第五歩では、親クラスの継承とメソッドのオーバーライドについて説明した。そこま
-
Objective-CでiOSアプリの第三歩 UIViewControllerの必要性を理解する
前回はUIViewControllerの存在を無視して"Hello, World!"アプリケーション
-
Objective-Cの第一歩(仕切り直し)
前回Objective-Cの第一歩として挙げたコードであるが、綺麗さっぱり忘れてほしい。というのは、
-
Objective-Cの第三歩 クラスとクラスメソッドを定義する
Swiftの事をひとまず置いておいてObjective-Cの入門編を書いているわけだが、前々回の"H
-
Xcode 6の正式リリースまでに、Objective-Cでアプリを一つ仕上げる!
Swiftに早速触れてみたい!でもXcode 6がベータ版の間は、有料(7800円/年)のDevel
-
Objective-Cの第四歩 インスタンスプロパティ・メソッドを定義する
Objective-Cの第三歩では、ピュアC言語からのObjective-Cのクラス入門ということで