【特集】
続いて、テキストの保存と読み込みを行ってみよう。少し長めのソースコードを書くことになる。
まず、保存や読み込みを行うタイミングを考えてみる。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;
}
}
まずテキストファイルのパスを決定する。これは先ほどのものとまったく同じだ。このファイルが存在する場合、読み込みの処理を行うことになる。
読み込み処理は、まずファイルをバイト列として読み込む。それを、エンコーディングを指定して、文字列に変換してやる。こうして得られたテキストを、テキストビューに設定してやればいいのだ。
こういったメソッドを実装する事で、アプリケーションの起動時、終了時に、自動的にテキストの保存と読み込みが行われるようになる。これで、かなり実用的なメモ帳に仕上がってきた。
ここまでのソースコードは、こちらのリンクからダウンロードできる。
| トマトを食べれば痩せられる!? -京大ら、新発見の成分で肥満改善効果を実証 [21:00 2/10] |
| JAXA、液体シリコン中に残存する共有結合を観察 -大口径ウェハの実現に期待 [20:11 2/10] |
| NEDOなど、熱膨張が小さな樹脂複合材料ペレットの量産化に成功 [19:22 2/10] |
| 理研、一般顕微鏡を蛍光顕微鏡に強化できるアダプタを試作して性能を実証 [19:15 2/10] |
| 天の川のブラックホールが小惑星を飲み込んでいる - NASAが発表 [18:08 2/10] |
|
TVアニメ『ソードアート・オンライン』、7月放送開始! キービジュアル公開 [21:58 2/10] ホビー |
|
CP+2012 各社ブースレポート集 [21:48 2/10] 家電 |
|
ソニエリ、「Xperia NX」の展示イベント開催 - 東京・名古屋・大阪で実施 [21:40 2/10] 携帯 |
|
【レポート】CP+2012 - 「EOS-1D X」展示や吉高由里子のトークショーに人だかりが - キヤノン [21:35 2/10] 家電 |
|
MEDIAS LTE購入者向けキャンペーン - 先着5,000名にモバイル充電器を提供 [21:31 2/10] 携帯 |