我正在为 iOS 开发待办事项列表应用程序。我有一个名为 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 写入文件并能够读取它。如果我写了多个 ToDoItem 对象,在读回它时,我会得到“[NSKeyedUnarchiver initForReadingWithData:]: incomprehensible archive”异常。我担心的是我只想在用户保存数据时附加我的 ToDoItem 对象,并在用户重新启动应用程序时再次检索所有信息。
NS编码方法
- (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;
}
提前致谢