Я разрабатываю приложение todo для iOS. У меня есть собственный класс под названием ToDoItem. Мой проект заключается в том, чтобы написать содержимое пользователя в текстовый файл и прочитать его обратно из файла, когда пользователь снова откроет приложение. Я применил методы, подтверждающие протокол NSCoding для моего класса ToDoItem.Добавление пользовательских объектов в txt-файл и чтение его
Способ записи данных приводится ниже
- (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:]: непонятный архив». Моя забота заключается в том, что я просто хочу добавить объекты 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;
}
Заранее спасибо
Пожалуйста, покажите свои методы 'NSCoding' для вашего класса ToDoItem. Кстати, во втором сегменте кода, когда он работает, 'arr' будет массивом' ToDoItems', поэтому вам не нужно перебирать и добавлять объекты в массив - вы можете просто назначить 'arr' для 'self.toDoItems' – Paulw11
@ Paulw11 Я добавил методы NSCoding. Также я попытался настроить массив [_toDoItems arrayByAddingObjectsFromArray: arr]. Но все еще сталкивается с той же ошибкой – Chandan
@ Paulw11 Если файл содержит более одного элемента, тогда второй сегмент кода будет генерировать исключение. Это место, где я застрял – Chandan