*

Objective-CでiOSアプリの第二歩 とにかく立ち上がればというレベルのHello, World!アプリを作成

公開日: : iOSアプリを書く! , ,

前回は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を追加・表示する。

無理矢理表示したHello, World!

無理矢理表示したHello, World!

これで完成、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が必要ですねとなっているので分かりにくいわけ。

関連記事

no image

iOSプログラミング入門書では、まず最初のHello, World!すら難しい

Hello, World!が第一歩 新しくプログラミング言語を習得するときに、「この言語でのH

記事を読む

クラスを継承して作成

Objective-Cの第五歩 クラスの継承とメソッドのオーバーライド

前回Objective-Cの第四歩では、等差数列の和を計算するプログラムGaussTesterの作成

記事を読む

アイコンは未指定なので不格好

Objective-CでiOSアプリの第一歩 新規プロジェクトで生成されるコードの解説

しけたコンソールアプリばかり作っていたけれど、ようやっとiOSプログラミングに入るとしよう。急がない

記事を読む

no image

Objective-Cでは何故.hファイルと.mファイルを作成させられるのか

前回説明したように、Objective-Cでプログラムを書く際には、別にC言語そのもののつもりで書い

記事を読む

no image

Objective-Cの第六歩 プロトコルの宣言と実装

Objective-Cの第五歩では、親クラスの継承とメソッドのオーバーライドについて説明した。そこま

記事を読む

画面の回転に対応したプログラム

Objective-CでiOSアプリの第三歩 UIViewControllerの必要性を理解する

前回はUIViewControllerの存在を無視して"Hello, World!"アプリケーション

記事を読む

no image

Objective-Cの第一歩(仕切り直し)

前回Objective-Cの第一歩として挙げたコードであるが、綺麗さっぱり忘れてほしい。というのは、

記事を読む

no image

Objective-Cの第三歩 クラスとクラスメソッドを定義する

Swiftの事をひとまず置いておいてObjective-Cの入門編を書いているわけだが、前々回の"H

記事を読む

no image

Xcode 6の正式リリースまでに、Objective-Cでアプリを一つ仕上げる!

Swiftに早速触れてみたい!でもXcode 6がベータ版の間は、有料(7800円/年)のDevel

記事を読む

GaussTester実行結果

Objective-Cの第四歩 インスタンスプロパティ・メソッドを定義する

Objective-Cの第三歩では、ピュアC言語からのObjective-Cのクラス入門ということで

記事を読む

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

no image
Swiftが今年後半を目処にオープンソース化!そしてSwift 2

一時期iOSとOSXの開発からは離れていたけれど、久しぶりの大きなニュ

RunSwiftスクショ
WEB上で動作するSwiftの疑似実行環境 RunSwift・SwiftStub

Swiftの実行環境はMac+Xcode。ウワサのSwift言語に興味

no image
待望のRetina iMacが登場! iOSアプリの開発が楽になる?

10月16日(日本時間17日)に行われたAppleの新製品発表会。大方

no image
Swiftの参考書 電子書籍以外にもボツボツと登場

書店の棚に並んでいるSwift本を見て、正式リリースを実感! 何しろ

no image
Swift1.0を含むXcode6のGMが公開

大体2週間の間隔を空けてbetaのヴァージョンナンバーが上がり続けてい

→もっと見る

PAGE TOP ↑