【特集】
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;
}
}
まずテキストファイルのパスを決定する。これは先ほどのものとまったく同じだ。このファイルが存在する場合、読み込みの処理を行うことになる。
読み込み処理は、まずファイルをバイト列として読み込む。それを、エンコーディングを指定して、文字列に変換してやる。こうして得られたテキストを、テキストビューに設定してやればいいのだ。
こういったメソッドを実装する事で、アプリケーションの起動時、終了時に、自動的にテキストの保存と読み込みが行われるようになる。これで、かなり実用的なメモ帳に仕上がってきた。
ここまでのソースコードは、こちらのリンクからダウンロードできる。
ヘッドライン
- Rambus、次世代携帯機器向けメモリ「モバイルXDR」を発表[21:16 2/9]エレクトロニクス
- Intel、基幹業務システム向け次世代プロセッサ「Itanium 9300」を発表[20:47 2/9]エレクトロニクス
- MicronとNanya、42nmプロセスを採用した2GビットDDR3を開発[20:07 2/9]エレクトロニクス
- ISSCC 2010 - 日立、1Gbpsあたり消費電力1mW以下のトランシーバ回路を開発[19:52 2/9]エレクトロニクス
- CSSを最適化する3つのツール[17:17 2/9]JavaScript / CSS / HTML
- TIOBEプログラミング言語人気 - Scratch/Erlang/Scala/JavaFX[17:17 2/9]プログラミング
- Microsoft、Red Hat Linuxサポートをひっそり追加[17:15 2/9]システム管理
- IBM、8コア/32MB eDRAM搭載の高速CPU「POWER7」を発表 - サーバも販売開始[17:02 2/9]サーバとストレージ
- 【レポート】UTM最新動向 - クラウドに耐えうる処理性能と管理性の強化が進む[14:42 2/9]セキュリティ
- あるコンパイラが重要なマイルストーンに到達、LLVM Clang[14:06 2/9]プログラミング





