iOSアプリケーションを実際に作ってみましょう。
今回は題材として簡易メモ帳を制作します。
Xcodeでのプロジェクト作成
まず[File]->[New Project]をクリックする。すると次の画面が表示される。
この中の「View-Based Application」を選択する。プロジェクトの名前の設定になるのでMemoPadと入力する。これでMemoPadプロジェクトが作成されプロジェクトウィンドウが表示される。
Xcodeによってあらかじめいくつかのファイルが生成されている。その中でMemoPadAppDelegateとMemoPadViewControllerクラスがあるのが確認できる。また拡張子がxib(XML Interface Builderの頭文字)のファイルはユーザーインターフェースのレイアウトを行うためのファイルでInterface Builderを使って編集することになる。
MemoPadViewController.hの編集
次にMemoPadViewController.hを次のように編集する。
[objc]
#import
@interface MemoPadViewController : UIViewController {
// テキストビューのためのアウトレット
IBOutlet UITextView* textView;
}
// キーボードを隠すためのアクション
- (IBAction)done;
@end
[/objc]
textViewインスタンス変数の先頭に付いているIBOutletはアウトレットと呼ばれ、Interface Builderに対して、この変数をユーザインタフェース上の部品と関連づけることができることを示している。
doneメソッドの返り値のIBActionはアクションと呼ばれ、アクションもInterface Builderで利用される。
[File]->[Save]で編集を保存しておく。
Interface Builderでのレイアウト
次にMemoPadViewController.xibをダブルクリックし、Interface Builderを起動する。
すると4つのウィンドウが表示される。
- MemoPadViewController.xibはxibファイルの内容を示すものである。
- Viewはアプリケーションを実行した時に表示される画面でこの上に部品を配置していくことになる。
- Attributesはビュー上に配置した部品の設定を行う画面
- Libraryはビューに配置する部品を選択することができる。
上の画像のように部品を配置する。ナビゲーションバーにはタイトルを設定する。Bur Button Item Attributesの「Style」と「Identifier」を「Done」に設定しておく。
アウトレットとアクションの接続
xibウィンドウ中のFile’s Ownerアイコンを右クリックする。
ここでこのインスタンスから接続可能なアウトレットのアクションの一覧が表示される。textViewの右端にある○をドラッグしてテキストビュー上でドロップする。
さらにdoneの右端にある○をドラッグしてDoneボタン上でドロップする。
[File]->[Save]で作業内容を保存する。
MemoPadViewController.mの編集
@implementationと@endという指示子の間に次のコードを書く。
[objc]
- (IBAction)done
{
// キーボードを隠す
[textView resignFirstResponder];
}
[/objc]
これで入力が終わったらDoneボタンを押すことでキーボードが隠れるようになった。
ビルドと実行
メニューからSimulatorとiPhoneを選択する。
そして「Build and Run」ボタンを押し、コンパイル、インストール、シミュレータ起動までを行う。
これでひとまず完成である。次からは機能の拡張をしていく。
デバイスの回転への対応
MemoPadViewController.mの次の部分を修正する。
[objc]
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
// デバイスが回転したとき、ビューも回転させる
return YES;
}
[/objc]
これで端末を回転すると画面も回転するようになる。
テキストの保存と読み込み
MemoPadViewController.mを次のように編集する
[objc]
- (void)viewWillDisappear:(BOOL)animated
{
// テキストファイルのパスを決定する
NSArray* paths;
NSString* path;
paths = NSSearchPathForDirectoriesInDomains(
NSDocumentDirectory, NSUserDomainMask, YES);
path = [paths objectAtIndex:0];
path = [path stringByAppendingPathComponent:@"text"];
// テキストからバイト列を作成する
NSData* data;
data = [textView.text dataUsingEncoding:NSUTF8StringEncoding];
// バイト列をファイルに書きこむ
[data writeToFile:path atomically:YES];
}
[/objc]
[objc]
- (void)viewWillAppear:(BOOL)animated
{
// テキストファイルのパスを決定する
NSArray* paths;
NSString* path;
paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
path = [paths objectAtIndex:0];
path = [path stringByAppendingPathComponent:@"text"];
// テキストファイルが存在する場合
if ([[NSFileManager defaultManager] fileExistsAtPath:path]) {
// ファイルをバイト列として読み込む
NSData* data;
data = [NSData dataWithContentsOfFile:path];
// バイト列をテキストに変換する
NSString* string;
string = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
[string autorelease];
// テキストをテキストビューに設定する
textView.text = string;
}
}
[/objc]
上のコードでビューが隠れるときにテキストを保存し、ビューが現れるときにテキストを読み込んでいる。
参考: