Apple iPhone 3GとiPhone SDKを使ってアプリケーションを開発、公開するための情報。

ホーム / Hardware / iPhone SDK

更新:10/04/10 | iPhone SDK でチュートリアル | iPone SDK

チュートリアル

Xcodeの開発環境いよいよチュートリアルの開始です。
基本的には備忘録ですので、個人的に時間を使って体得した内容を形として残すための情報という位置づけです。
将来的にAppStoreでの公開も見据えたいので有る程度まともなものに仕上げたいと考えます。まずは、Todoアプリを作成します。

TodoアプリはAppStoreにも多数存在しますが、個人的に必要な機能を満たしているものがないので作るのに容易で作った後もある程度活用の道があるアプリケーションと言うことで最適と判断しました。

 

Navigation-Based Application

iPhone SDKまずは、Xcodeを起動してプロジェクトを新規作成します。Xcodeの準備が出来ていない方は、iPhone SDKの紹介から参照してください。

通常はアプリケーションの設計から入るのが定石と思いますが、何をどんな風に実装できるかも分からない状態なのでコーディングしながら仕様は決めていきます。

取り敢えず、Navigation-Based Applicationというテンプレートを使ってプロジェクトを作成することで、テーブルをベースにしたアプリケーションを直ぐに作り始めることが出来ます。

 

タイトルやボタンを付ける

作成されたアプリケーションは直ぐにビルド&シミュレーター上で実行することが出来ますが、いわゆるのっぺらぼうの状態です。
ただ、最上部にナビゲーションバーが存在していることに気づくはずです。このナビゲーションバーにタイトルを付けたり、ボタンを配置することから始めてみます。

ソースコードを構成するファイルは、クラス毎に作成されます。頭文字は大文字です。一覧を見ると、最初から存在するファイルの中に、

という、2つのファイルが存在しているはずです。
拡張子hのファイルはヘッダーファイルで、このクラスの骨組み、概要情報が含まれています。mのファイルはメインファイルで、このクラスの実装部分がコーディングされていきます。つまり、Objective-Cではクラス毎にh、mという拡張子のファイルが個別に作成されることになります。

RootViewController.mをクリックすると、Xcodeのビューにコードが表示されます。
色々と不思議な呪文が書かれていると思われる方もいるかも知れませんが、随時紹介しますのでまずは次のキーワードを探してください。

- (void)viewDidLoad {

マイナスから始まっているキーワードはインスタンスメソッドで、このクラスから作成されたインスタンス毎に用意されるメソッドです。プラスから始まるものもいずれ見かけるかも知れませんが、これはクラスメソッドで作成されたインスタンス全てから共通して呼び出されるメソッドです。クラスメソッドの代表例はクラスからインスタンスを作るallocメソッドがあります。

頭の(void)は、このメソッドに戻り値がないことを表しています。
呼び出し側に何らかの値を戻すメソッドは、()の中に戻り値の型が入ります。

viewDidLoadは、予約されているメソッド名でその名の通りこのビュー(=テーブルベースのビュー)がiPhoneに読み込まれた直後に呼び出されるメソッドであることを意味しています。そのため、大概の場合初期値の設定などを行うコードがこのメソッドの中に書かれます。

{}で囲まれた中にタイトルやボタンの追加を実装するコードを書いていきましょう。

self.title = NSLocalizedString (@"Todo",@"");
self.navigationItem.leftBarButtonItem = self.editButtonItem;

// Add the Insert button
UIBarButtonItem *addButton= [[[UIBarButtonItem alloc]
initWithTitle:NSLocalizedString(@"Add", @"")
style:UIBarButtonItemStyleBordered
target:self
action:@selector(addAction:)] autorelease];

self.navigationItem.rightBarButtonItem = addButton;

前段のコードは、タイトルを"Todo"に設定することを意味しています。

後段はのコードは、左側に編集ボタンを配置し、右上側に"Add"と称されるボタンを配置する事を意味しています。
これらのコードには、Objective-Cにおける様々なコーディングルールをかいま見ることが出来ます。まずは、この基本ルールについておさらいしておきます。

selfというのは自インスタンスを指しています。VBのmeに似ているかも知れません。
また、navigationItemというのは予め自動生成されている画面上部のナビゲーションバーそのもののインスタンス名です。

NSLocalizedStringという関数(?)は、複数言語対応する際に活用できるものと推測しています。そのため、常に"Add"でいいという場合には、

initWithTitle:@"Add"

と書くことも可能です。@"文字列"というのが、Objective-Cにおける文字列の指定方法であることも見て取れます。

また、一つのコードの最後にはC言語特有の「;」セミコロンを付ける必要があります。その代わりに、セミコロンに至るまでは何度改行しても構いません。

[UIBarButtonItem alloc]に注目してみます。Objective-Cでは、他のインスタンス、クラスに対するメソッドの実行は大カギ括弧[]を使って表現されます。この場合、UIBarButtonItemというクラスに対して、allocメソッドを実行しなさいという意味になります。
実は、allocメソッド(クラスメソッド)が実行されると、戻り値は(ID)型の生成ほやほやのインスタンスになります。ここでインスタンス化されたオブジェクトは、

UIBarButtonItem *addButton=

という形でaddButtonなるUIBarButtonItem型のポインタ変数に代入されています。*印から始まる変数はC言語でお馴染みのポインタをやはり意味していますが、一般的にプログラミングしている限りはあまり気にしなくても問題ないはずですので、ポインタに対する嫌悪感を覚える必要はまだありません。

target:self

などといったプロパティ(引数)の渡し方はVBやVBScriptでお馴染みなので抵抗のない型も多いと思います。

action:@selector(addAction:)

このキーワードは大変重要です。
"Add"という名前のボタンがタッチされた際に呼び出されるメソッドが"addAction:"であることを意味しており、当然そのようなメソッドは実在していないのでこの後、具体的に実装していくことになります。

self.navigationItem.rightBarButtonItem = addButton;

という最後のコードで、navigationItemオブジェクトの右ボタンにポインタ変数addButtonを代入する形で実装を完了しています。

iPhoneのナビゲーションバー

シミュレーターで実行すると、実際に結果に反映されていることが分かります。
Editボタンはタッチ(シミュレーター上ではクリック)すると実際に効果を確認できますが、Addボタンは実装がまだされていませんのでエラーとなります。


タッチイベントのハンドラーを実装する

Addボタンをクリックしたら、メッセージを表示する機能を実装してみます。最終的には別のビューにスライドする効果を実装しますが、その前段実験といえます。

- (void)addAction:(id)sender
{
 // the add button was clicked, handle it here
 // Alert
 UIAlertView *alert = [[UIAlertView alloc]  initWithTitle:NSLocalizedString(@"Alert", @"")
 message:@"abc."
 delegate:self
 cancelButtonTitle:@"OK"
 otherButtonTitles:nil];
 [alert show];
 [alert release];
}

上記のように適当な場所……自分で見やすい場所に新たに

- (void)addAction:(id)sender
{
}

というキーワードをコーディングします。このaddAction:というメソッド名は、前述でAddボタンを追加したときのActionプロパティに指定したメソッド名です。
メソッドの引数としては(id)型の送信者となるオブジェクトが渡され、メソッドの中ではsenderという変数名で利用できることが意味されています。

中括弧の中はアラートを表示するメソッドが書かれています。

UIAlertView alloc

で、UIAlertView型のインスタンスをallocメソッドで作成し、その戻り値であるインスタンスそのもののinitWithTitleメソッドを入れ子にして呼び出しています。
一般的にObjective-Cではこのように、インスタンスかと同時にinit〜メソッドを呼び出すのが通例となっています。

インスタンス化して初期化されたこのオブジェクトは、

UIAlertView *alert

に代入されています。UIAlertView型のポインタ変数alertに代入されています。
[alert show];
[alert release];
という2行で、alertのshowメソッドを呼び出し実際にメッセージを画面に表示、alertのreleaseメソッドを呼び出してalert変数を解放するという仕組みになっています。

ここでは(今後しばらく)あまり気にしないことにしますが、このようにC言語特有の「メモリ管理を開発者が行う」という旧世代的なメモリ管理方式がとられることが今も通例のようです。
ただ、新しいSDKではガーベージコレクション機能を選択することも出来るので、Javaなどのようにメモリ管理をせずにコーディングを進めることも出来ます。ただ、現存する殆どのサンプルが開発者によるメモリ管理を前提としたコードとなっているため、今後も甘んじてこの苦行に挑むこととします(実際に挑むのは出来るだけ後回しにします)。

今度は、RootViewController.h を編集します。
RootViewController.hには、このクラスの設計情報を記述することになります。先に実装を行いましたが、同時に設計情報の編集も必要となります。

@interface RootViewController : UITableViewController {

}

// add button action method
- (void)addAction:(id)sender;

上記のように、addAction:というメソッドを新たに追加していることを@interface * {}の後に記述します。{}の中にはインスタンスプロパティ(変数)の定義を記述し、その後にはインスタンスメソッドを記述するように決められています。

これで、Addボタンをクリックした際にポップアップメッセージが表示されるようになりました。

iPhoneのアラートメッセージを実装

このウィンドウはいわゆるモーダレスで、OKをタッチする前にプログラムの実行は止まらずに先のステップへと進みます。

Copyright (c)1998-2016 CNXGROUP All Rights Reserved.
このページの全部あるいは一部を無断で利用(コピー)することを禁じます。
>