【特集】

iPhoneアプリケーション開発入門

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

    木下誠  [2008/12/24]

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

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

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

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

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

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

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

    関連したタグ

    新着記事

    特設サイトの情報

      人気記事

      一覧

        イチオシ記事

        新着記事

        特別企画

        マイナビニュースマガジン