テキストの保存と読み込み
続いて、テキストの保存と読み込みを行ってみよう。少し長めのソースコードを書くことになる。
まず、保存や読み込みを行うタイミングを考えてみる。iPhoneアプリケーションには、「保存」や「開く」といったメニューはない。ということは、アプリケーションが適切なタイミングで、自動的にこれらの処理を行う必要がある。
パッと考えつくのは、アプリケーションが起動するときと終了するときだ。だが、これはあまり上手くない。なぜなら、アプリケーションの起動直後では、まだテキストビューが作られておらず、テキストを読み込んだとしても設定する対象が無いからだ。
また、今回はメモ帳は1ページしかないが、アプリケーションを拡張すれば複数のページに対応する必要も出てくるだろう。そのような場合、別のページに切り替わるタイミングで保存を行わなくてはいけない。
このようなことを考えると、保存や読み込みを行うタイミングは、ビューが表示される直前と、ビューが隠れる直前ということになるだろう。これらは、UIViewControllerのメソッドを使う事で、捕まえることができる。それぞれ、viewWillAppear:とviewWillDisappear:だ。このメソッドを上書きする。
まず、viewWillDisappear:の方からいこう。このメソッドは、ビューが隠れる直前に呼び出される。ここで行うのは、テキストの保存だ。次のようなメソッドを追加してほしい。
MemoPadViewController.m
- (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];
}
まず、テキストファイルを保存するパスを決定する。これには、NSSearchPathForDirectoriesInDomainsという関数を使う。これを使って、Documentsフォルダの下の、textという名前のファイルのパスを作成する。
次に、テキストビューからテキストを取り出し、これをエンコーディングを指定してバイト列に変換する。エンコーディングとしてはNSUTF8StringEncodingを使った。最後に、このバイト列をファイルに書き込む。
ここでは、NSDataやNSStringといったクラスが出てきたが、これらはCocoa Touchの中の、Foundationと呼ばれるフレームワークに属するクラスだ。Foundationは、iPhoneとMac OS Xで共通して使われるフレームワークになる。これらのクラスの使い方を調べるときは、Mac OS Xのプログラミング解説書が役に立つだろう。
次に、viewWillApeear:を紹介する。これは、ビューが表示される直前に呼び出されるもので、先ほどのviewWillDisappear:と対になる。その中身も、先ほどの手順を逆になぞることになる。
MemoPadViewController.m- (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;
}
}
まずテキストファイルのパスを決定する。これは先ほどのものとまったく同じだ。このファイルが存在する場合、読み込みの処理を行うことになる。
読み込み処理は、まずファイルをバイト列として読み込む。それを、エンコーディングを指定して、文字列に変換してやる。こうして得られたテキストを、テキストビューに設定してやればいいのだ。
こういったメソッドを実装する事で、アプリケーションの起動時、終了時に、自動的にテキストの保存と読み込みが行われるようになる。これで、かなり実用的なメモ帳に仕上がってきた。
ここまでのソースコードは、こちらのリンクからダウンロードできる。