2014-02-14 58 views
0

我在cellForRowAtIndexPath方法中有以下一段代码。满足一些条件时,该代码用于从Core Data Store中删除对象。删除cellForRowAtIndexPath方法中的核心数据对象

我会尽量解释使用一个特定的对象我的问题:

应用为对象的启动条件:

属性quitar = @"si"

瞬态属性sectionIdentifier = @"0"

如果用户添加一个新的对象的部分,那么我们的示例对象获得以下值:

属性quitar = @"si"

瞬态属性sectionIdentifier = @"0"

borrar = @"si se puede borrar"属性;

该应用程序使我所期望的,这意味着,示例对象被删除,刚添加的对象显示在部分内。 但是,这只是部分正确的,然后在检查Core Data Store之后,示例对象已经改变了它的属性,但并未被删除。 该行为使得应用程序在下次应用程序启动时崩溃。如果我再次启动应用程序,则示例对象在Core Data Store中显示为已删除。

这是异常消息:

2014-02-14 11:32:27.033 DidIt[11267:a0b] *** Assertion failure in -[UITableViewRowData rectForRow:inSection:heightCanBeGuessed:], /SourceCache/UIKit_Sim/UIKit-2903.23/UITableViewRowData.m:1793 
2014-02-14 11:32:27.041 DidIt[11267:a0b] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'request for rect at invalid index path (<NSIndexPath: 0x8a22c00> {length = 2, path = 0 - 1})' 

这是我的作品中涉及的问题代码,因为说这是cellForRowAtIndexPath方法中:

//QUITAR SPECIAL ROW SECTION 0 

     NSString *sec = todoitem.sectionIdentifier; 
     NSString *quitar = todoitem.quitar; 



     if ([sec isEqualToString:@"0"] && [quitar isEqualToString:@"si" ] && (numObjectsSec0 > 1)){ 

      NSLog(@"SE PODRIA QUITAR ESTE OBJETO *************************4 %@", todoitem.todoName); 



      NSManagedObjectContext *context = self.managedObjectContext; 
      [todoitem setValue:@"si se puede borrar" forKey:@"borrar" ]; 
      has0SpecialRow = @"no"; 
      NSError *error = nil; 
      // Save the object to persistent store 
      if (![context save:&error]) { 


       [context deleteObject: todoitem]; 

      } 




     } 
     //END QUITAR SPECIAL ROW SECTION 0 
+1

我不知道该怎么想,异常消息,但在'cellForRowAtIndexPath'删去管理的对象是一个**真正做事**奇怪的方式。如果你解释你为什么这样做,这可能会有所帮助。 –

+0

谢谢@TomHarrington,我会试着解释我为什么要这样做。在tableView中有六个固定部分,我也实现了展开/折叠部分行的方式。我添加或删除对象时检测到异常,如果有空白部分。这使得我创建了一种机制,在每个部分上创建一个新对象(我称它为特殊行),如果其上没有行(普通对象)。然后当创建一个普通对象时,我使用上面提到的代码来删除特殊行。直到今天它工作良好,但我想我已经改变了一些事情。 – mvasco

+0

@TomHarrington,可能会更好地使用此代码来设置属性值,然后在另一个方法上执行删除? – mvasco

回答

0

我已经解决了这个问题删除行:

NSError *error = nil; 
      // Save the object to persistent store 
      if (![context save:&error]) { 


       [context deleteObject: todoitem]; 

      } 

并将下面的代码放入viewWillAppear方法:

NSManagedObjectContext *context = self.managedObjectContext; 

    NSEntityDescription *entity=[NSEntityDescription entityForName:@"ToDoItem" inManagedObjectContext:context]; 
    NSFetchRequest *fetch=[[NSFetchRequest alloc] init]; 
    [fetch setEntity:entity]; 
    NSPredicate *predicate=[NSPredicate predicateWithFormat:@"borrar like 'si se puede borrar'"]; 
    [fetch setPredicate:predicate]; 
    NSError *fetchError; 
    NSArray *fetchedData=[self.managedObjectContext executeFetchRequest:fetch error:&fetchError]; 
    for (NSManagedObject *item in fetchedData){ 

     [context deleteObject:item]; 
    } 
相关问题