2014-02-14 2 views
0

У меня есть следующий фрагмент кода внутри метода cellForRowAtIndexPath. Код используется для удаления объекта из Core Data Store при выполнении некоторых условий.Удаление основного объекта данных внутри cellForRowAtIndexPath метод

Я попытаюсь объяснить мою проблему с помощью одного конкретного объекта:

App условия запуска для объекта:

атрибута quitar = @"si"

переходных атрибутов sectionIdentifier = @"0"

Если пользователь добавляет новый объект к разделу, то наш примерный объект получает следующие значения:

атрибут quitar = @"si"

переходный атрибут sectionIdentifier = @"0"

атрибут borrar = @"si se puede borrar";

Приложение делает то, что я ожидаю, это означает, что объект объекта удален, и только что добавленный объект отображается внутри раздела. Но это лишь частично верно, то после проверки хранилища основных данных объект-пример изменил свои атрибуты, но не удаляется. Такое поведение приводит к сбою приложения при следующем запуске приложения. Если я снова запустил приложение, объект примера появится как удаленный в хранилище основных данных.

Это сообщение об исключении:

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]; 
    } 
Смежные вопросы