iOS用のtodoリストアプリを開発しています。ToDoItem というカスタム クラスがあります。私の設計は、ユーザーのコンテンツをテキスト ファイルに書き込み、ユーザーがアプリを再度開いたときにファイルから読み戻すことです。ToDoItem クラスの NSCoding プロトコルに準拠するメソッドを実装しました。
データの書き込み方法を以下に示します。
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
// if cancel button is pressed
if (sender!=self.saveBtn) {
return;
}
// if save button is pressed
else{
if (self.addField.text.length>0) {
ToDoItem *item = [[ToDoItem alloc] init];
item.itemName = self.addField.text;
item.isDone = FALSE;
item.row = [ToDoListTableTableViewController getCount];
self.toDoItem = item;
NSMutableArray *arr = [NSMutableArray arrayWithContentsOfFile:_appFile];
[arr addObject:item];
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:arr];
NSFileHandle *handle = [NSFileHandle fileHandleForWritingAtPath:_appFile];
[handle seekToEndOfFile];
[handle writeData:data];
[handle closeFile];
}
}
データの読み取り方法を以下に示します。
- (void)loadData{
if ([[NSFileManager defaultManager] fileExistsAtPath:_appFile]) {
NSFileHandle *handle = [NSFileHandle fileHandleForReadingAtPath:_appFile];
if (handle) {
NSData *data = [handle readDataToEndOfFile];
if (data) {
ToDoItem *item;
NSMutableArray *arr = [NSKeyedUnarchiver unarchiveObjectWithData:data];
for (item in arr) {
[_toDoItems addObject:item];
}
}
[handle closeFile];
}
}}
これで、ToDoItem を 1 つだけファイルに書き込んで読み取ることができるようになりました。ToDoItem の複数のオブジェクトを書き込んで読み返すと、"[NSKeyedUnarchiver initForReadingWithData:]: incomprehensible archive " という例外が発生します。私の懸念は、ユーザーがデータを保存したときに ToDoItem オブジェクトを追加し、ユーザーがアプリを再起動したときにすべての情報を再度取得したいということです。
NSCoding メソッド
- (void)encodeWithCoder:(NSCoder *)aCoder{
[aCoder encodeObject:_itemName forKey:ITEMNAME];
[aCoder encodeObject:_date forKey:DATE];
[aCoder encodeBool:_isDone forKey:DONE];
[aCoder encodeInteger:_row forKey:ROW];
}
- (id)initWithCoder:(NSCoder *)aDecoder{
self = [super init];
if (self) {
_itemName = [aDecoder decodeObjectForKey:ITEMNAME];
_date = [aDecoder decodeObjectForKey:DATE];
_isDone = [aDecoder decodeBoolForKey:DONE];
_row = [aDecoder decodeIntegerForKey:ROW];
}
return self;
}
前もって感謝します