我有問題,將數據保存到CoreData並顯示在表視圖controller.The問題是這個視頻:https://www.youtube.com/watch?v=6Di9zeAeBWs&feature=youtu.be工作與重載CoreData在tableViewController
當我刪除類不發生任何問題。該課程被正確刪除(我的視頻的第一部分)。但是,當我添加一個新類的程序將報告錯誤:
2014-03-13 16:31:02.771 IISForTeachers [30568:70B] CoreData:錯誤:嚴重的應用程序錯誤。在調用-controllerDidChangeContent:期間,NSFetchedResultsController的委託捕獲到異常。無效更新:第0節中的行數無效。更新(3)後現有節中包含的行數必須等於更新前(3)的該節中包含的行數,加上或減去數字插入或從該部分刪除的行(插入0,刪除1)以及加或減移入或移出該部分的行數(移入0,移出0)。與userInfo(空) 2014-03-13 16:31:02.774 IISForTeachers [30568:70b] _context SAVED更改爲持久性存儲。
將錯誤日期保存到持久性存儲之後。數據的保存工作正常,因爲我在桌面視圖控制器中看到新的分區,並且當我停止並再次運行應用程序時,新數據就在那裏。但是當我添加一個新的類並且我想要刪除一個類時,應用程序崩潰(視頻的第2部分)。
當我再次運行應用程序時,新的類在表視圖中,我刪除它沒有問題(第3部分)。
這裏是用於刪除我的細胞的功能的代碼:
-(void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath{
if(debug == 1){
NSLog(@"Running %@ '%@'",self.class, NSStringFromSelector(_cmd));
}
CoreDataHelper *cdh = [(AppDelegate *) [[UIApplication sharedApplication] delegate] cdh];
if (editingStyle == UITableViewCellEditingStyleDelete) {
SchoolClass *class = [self.frc objectAtIndexPath:indexPath];
[[class managedObjectContext] deleteObject:class];
}
[cdh saveContext];
[self.tableView reloadData];
}
FRC
在ClassesTVC.m擷取日期(表視圖控制器,其中是顯示所有的類)。
-(void)configureFetch{
if(debug == 1){
NSLog(@"Running %@ '%@'",self.class, NSStringFromSelector(_cmd));
}
CoreDataHelper *cdh = [(AppDelegate *) [[UIApplication sharedApplication] delegate] cdh];
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"SchoolClass"];
request.sortDescriptors = [NSArray arrayWithObjects:[NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES], nil];
[request setFetchBatchSize:50];
self.frc = [[NSFetchedResultsController alloc] initWithFetchRequest:request
managedObjectContext:cdh.context
sectionNameKeyPath:nil
cacheName:nil];
self.frc.delegate = self;
}
將FRC在CoreDataTVC.h(對於具有表視圖控制器工作的通用類)definet並且被定義爲休耕:
@property (strong, nonatomic) NSFetchedResultsController *frc;
有(CoreDataTVC)也是功能performFetch:
-(void)performFetch{
if(debug == 1){
NSLog(@"Running %@ '%@'",self.class, NSStringFromSelector(_cmd));
}
if(self.frc){
[self.frc.managedObjectContext performBlock:^{
NSError *error = nil;
if(![self.frc performFetch:&error]){
NSLog(@"Failed to perform fetch: %@", error);
}
[self.tableView reloadData];
}];
}
else{
NSLog(@"Failed to fetch, the fetched results controller is nil.");
}
}
編輯-----------
我改變我的代碼,現在刪除行的功能如下:
-(void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath{
if(debug == 1){
NSLog(@"Running %@ '%@'",self.class, NSStringFromSelector(_cmd));
}
CoreDataHelper *cdh = [(AppDelegate *) [[UIApplication sharedApplication] delegate] cdh];
if (editingStyle == UITableViewCellEditingStyleDelete) {
[tableView beginUpdates];
SchoolClass *class = [self.frc objectAtIndexPath:indexPath];
[[class managedObjectContext] deleteObject:class];
[tableView endUpdates];
}
[cdh saveContext];
[self.tableView reloadData];
}
現在,應用程序的工作不錯,但只有當我插入一個輸入(類名)。當我插入類名和類教師是空的,比我可以刪除任何問題的單元格。但是,當我插入兩個輸入(classname,classteacher)時,應用程序再次顯示錯誤。 這裏是應用程序的行爲對不起視頻的質量:https://www.youtube.com/watch?v=PqSxqjuyZbU&feature=youtu.be
錯誤是相同的:
2014-03-14 12:15:08.309 IISForTeachers [35735:70B] CoreData:錯誤:嚴重的應用程序錯誤。在調用-controllerDidChangeContent:期間,NSFetchedResultsController的委託捕獲到異常。無效的更新:部分0中的行數無效。更新(5)後現有部分中包含的行數必須等於更新前(5)部分中包含的行數,加上或減去數字插入或從該部分刪除的行(插入0,刪除1)以及加或減移入或移出該部分的行數(移入0,移出0)。 with userInfo(null)
這是將Texfield分配給對象類類型的代碼。我不知道哪裏可能會有問題。感謝幫助。
-(void)textFieldDidEndEditing:(UITextField *)textField{
if (debug == 1) {
NSLog(@"Running %@ '%@'", self.class, NSStringFromSelector(_cmd));
}
CoreDataHelper *cdh = [(AppDelegate *)[[UIApplication sharedApplication]delegate]cdh];
SchoolClass *class = (SchoolClass*) [cdh.context existingObjectWithID:self.selectedClassID error:nil];
if(textField == self.classNameTextField){
if([self.classNameTextField.text isEqualToString:@""])
{
self.classNameTextField.text = @"Nova trida";
}
class.name = self.classNameTextField.text;
}
else if (textField == self.classTeacherTextField){
class.classTeacher = self.classTeacherTextField.text;
}
}
您是如何實現FRC委託方法的? – Wain
已添加問題。 – krata
刪除commitForitingStyle中的單元而不是重新加載整個表[tableView deleteRows ... etc] – Tim