テキストの保存と読み込み

続いて、テキストの保存と読み込みを行ってみよう。少し長めのソースコードを書くことになる。

まず、保存や読み込みを行うタイミングを考えてみる。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;
    }
}

まずテキストファイルのパスを決定する。これは先ほどのものとまったく同じだ。このファイルが存在する場合、読み込みの処理を行うことになる。

読み込み処理は、まずファイルをバイト列として読み込む。それを、エンコーディングを指定して、文字列に変換してやる。こうして得られたテキストを、テキストビューに設定してやればいいのだ。

こういったメソッドを実装する事で、アプリケーションの起動時、終了時に、自動的にテキストの保存と読み込みが行われるようになる。これで、かなり実用的なメモ帳に仕上がってきた。

ここまでのソースコードは、こちらのリンクからダウンロードできる。