РЕДАКТИРОВАТЬ: Найдена фактическая причина сбоя.Мне нужно было удалить и переустановить, чтобы проверить должным образом без сбоев, как я изменил модель данных.Тем не менее, сейчас есть пример правильного сохранения массива coredata.Как я могу это сделать?
У меня есть UITableView, и я хочу иметь возможность вводить текст в ячейки, затем сохранять этот текст в массиве, а затем загружать текст обратно из массива, когда вызагрузить приложение.
Я использую CoreData, но, похоже, возникают некоторые проблемы.Вот что я имею до сих пор.
В функции cellForRowAtIndex я добавляю UITextFields в качестве подпредставления каждой ячейки, чтобы я мог их печатать и вводить их только тогда, когда включен мой UISwitch, editCells.В четырех ячейках есть предустановленный текст, который я установил.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
}
UITextField *textField = [[UITextField alloc] initWithFrame:CGRectMake(15, 20, 185, 30)];
textField.delegate = self;
// Configure the cell...
if ([indexPath row] == 0) {
[cell setAccessoryView:textField];
textField.text = @"Before School";
textField.font = [UIFont fontWithName:@"Helvetica-Oblique" size:16];
textField.enabled = FALSE;
}
else if ([indexPath row] == 3) {
[cell setAccessoryView:textField];
textField.text = @"Break Time";
textField.font = [UIFont fontWithName:@"Helvetica-Oblique" size:16];
textField.enabled = FALSE;
}
else if ([indexPath row] == 6) {
[cell setAccessoryView:textField];
textField.text = @"Lunchtime";
textField.font = [UIFont fontWithName:@"Helvetica-Oblique" size:16];
textField.enabled = FALSE;
}
else if ([indexPath row] == 9) {
[cell setAccessoryView:textField];
textField.text = @"After School";
textField.font = [UIFont fontWithName:@"Helvetica-Oblique" size:16];
textField.enabled = FALSE;
}
else if ([indexPath row] == 1 || [indexPath row] == 2 || [indexPath row] == 4 || [indexPath row] == 5 || [indexPath row] == 7 || [indexPath row] == 8) {
[cell setAccessoryView:textField];
textField.font = [UIFont fontWithName:@"Helvetica" size:16];
if (editCells.on == TRUE) {
textField.enabled = TRUE;
}
else {
textField.enabled = FALSE;
}
}
[monArrayA addObject:textField.text];
[textField release];
return cell;
}
Чтобы сохранить, я запускаю его, когда значение editCells изменяется, поэтому, когда пользователь завершит редактирование, его сохраненные данные будут переключены.выкл.Я делаю новый объект для сохранения с основными данными.Я сохраняю урок, который представляет собой массив со всем текстом ячейки и таблицей, в которой он должен находиться, но сохраняя его тег.Но, конечно, это приводит к ошибке SIGABRT и вылетает из приложения при щелчке переключателя.
[editCells addTarget:self action:@selector(editCells:) forControlEvents:UIControlEventValueChanged];
-(void)editCells:(id)sender{
[monTable reloadData];
//Create a new object to save.
NSManagedObject *newLesson;
//Tell it to be saved to the DatedText entity using the managedObjectContext, context_.
newLesson = [NSEntityDescription insertNewObjectForEntityForName:@"TimeTable" inManagedObjectContext:self.managedObjectContext];
//Set two values within this object, being the text the user entered and the date from the datePicker.
//Save these to their appropriate properties within this entity.
[newLesson setValue:monArrayA forKey:@"lessonName"];
[newLesson setValue:monTable.tag forKey:@"table"];
//Create error incase of failure to save.
NSError *saveError = nil;
//Try and access the data store via context_ and fall back on saveError if fails.
[self.managedObjectContext save:&saveError];
if (saveError != nil) {
//Report error by printing it to the console.
NSLog(@"[%@ saveContext] Error saving context: Error = %@, details = %@",[self class], saveError,saveError.userInfo);
}
}