7

У меня возникли трудности с внедрением 2 nsfetchedresultsController в tableView. Я хотел fetchedresultsController в каждой секции таблицы (2 секции), что-то вроде этого:
Несколько NsfetchedResultsController на UItableView

Wishlist

  • продукт
  • product2

Купил

  • product3

Я знаю, что для этого примера я бы не нужно 2 nsfetchedResultsController, но я буду нуждаться в этом позже ..

когда я удалить продукт из одного nsfetchedResultsController он переходит на другую и я получаю эту ошибку:

Invalid update: invalid number of rows in section 0. The number of rows contained in an existing section after the update (0) must be equal to the number of rows contained in that section before the update (0), plus or minus the number of rows inserted or deleted from that section (1 inserted, 0 deleted). with userInfo (null)"

Я думает, что это происходит потому, что, когда первый fetchedRController обнаруживает изменение обновляет Tableview до второй один называется правильно? следует ли использовать NSMutableArrays и обновлять таблицуView вручную?

Код:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
NSInteger numberOfRows = 0; 

switch (section) 
{ 
    case WISHLIST_SECTION: 

    { 
     numberOfRows =[[fetchedResultsControllerwish fetchedObjects]count]; 


    }; 
     break; 

    case PURCHASED_SECTION: 
    { 
     numberOfRows =[[fetchedResultsControllerPurchased fetchedObjects]count]; 

    }; 
     break; 


    default: 
     break; 
} 
return numberOfRows; 
} 

- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller { 
// The fetch controller is about to start sending change notifications, so prepare the table view for updates. 
[self.tableView beginUpdates]; 
} 


- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller 
{ 

// The fetch controller has sent all current change notifications, so tell the table view to process all updates. 
[self.tableView endUpdates]; 
} 

- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject 
    atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type 
    newIndexPath:(NSIndexPath *)newIndexPath { 

UITableView *tableViewT = self.tableView; 

switch(type) { 

    case NSFetchedResultsChangeInsert: 
     [tableViewT insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] 
         withRowAnimation:UITableViewRowAnimationFade]; 
     break; 

    case NSFetchedResultsChangeDelete: 
     [tableViewT deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] 
         withRowAnimation:UITableViewRowAnimationFade]; 
     break; 

    case NSFetchedResultsChangeUpdate: 
     [self configureCell:(GiftEventTableViewCell *)[tableViewT cellForRowAtIndexPath:indexPath] atIndexPath:indexPath]; 
     break; 

    case NSFetchedResultsChangeMove: 
     [tableViewT deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] 
         withRowAnimation:UITableViewRowAnimationFade]; 
     [tableViewT insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] 
         withRowAnimation:UITableViewRowAnimationFade]; 
     break; 
} 
} 

-(void)configureCell:(GiftEventTableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath 
{ 
switch (indexPath.section) { 
    case WISHLIST_SECTION: 
    { 
     GiftEvent *giftEv=(GiftEvent *)[fetchedResultsControllerwish objectAtIndexPath:indexPath]; 
     cell.gift=giftEv; 

    }; 
     break; 
    case PURCHASED_SECTION: 
    { 
     GiftEvent *giftEv=(GiftEvent *)[fetchedResultsControllerPurchased objectAtIndexPath:indexPath]; 

     //if i don't use indexpath.row in the second section i get an out of bounds error 
     //GiftEvent *giftEv=(GiftEvent *)[[fetchedResultsControllerPurchased fetchedObjects]objectAtIndex: indexPath.row]; 
     cell.gift=giftEv; 

    }; 
     break; 




    default: 
     break; 
} 

} 

// Override to support editing the table view. 
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath { 
if (editingStyle == UITableViewCellEditingStyleDelete) 
{ 
    switch (indexPath.section) { 
     case WISHLIST_SECTION: 
     { 
      // Delete the managed object for the given index path 

      [self.managedObjectContext deleteObject:[fetchedResultsControllerwish objectAtIndexPath:indexPath]]; 

      // Save the context. 
      NSError *error; 
      if (![self.managedObjectContext save:&error]) { 
       /* 
       Replace this implementation with code to handle the error appropriately. 

       abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. If it is not possible to recover from the error, display an alert panel that instructs the user to quit the application by pressing the Home button. 
       */ 
       NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
       abort(); 
      } 
      [self.tableView reloadData]; 

      }; 
      break; 
     case PURCHASED_SECTION: 
     { 
      // Delete the managed object for the given index path 

      [self.managedObjectContext deleteObject:[fetchedResultsControllerPurchased objectAtIndexPath:indexPath]]; 

      // Save the context. 
      NSError *error; 
      if (![self.managedObjectContext save:&error]) { 
       /* 
       Replace this implementation with code to handle the error appropriately. 

       abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. If it is not possible to recover from the error, display an alert panel that instructs the user to quit the application by pressing the Home button. 
       */ 
       NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
       abort(); 
      } 

     }; 
      break; 

     default: 
      break; 
    } 
} 
} 

ответ

1

:) извините, ребята, это была ошибка noob. Ошибка произошла, потому что indexPath.section вернул раздел в tableView, но у меня не было секций в fetchedResultsController (всегда индекс 0). EDIT: на самом деле есть один.

NSIndexPath *indexPathTemp = [NSIndexPath indexPathForRow:indexPath.row inSection:0]; 

Не уверен, что это лучший способ, но решил проблему.
Thks!
Ricardo Castro

1

Использование нескольких неправильного подхода. Правильное решение состоит в том, чтобы использовать параметр sectionNameKeyPath для NSFetchedResultController, чтобы сгруппировать результаты по нескольким разделам, в вашем случае это будет приобретенное логическое свойство продукта. И вы также должны сделать это первым дескриптором сортировки в порядке возрастания, так как вы хотите приобрести приобретенную выше приобретенную.Используйте метод делегата таблицы заголовка, чтобы вернуть строки «Список пожеланий» и «Приобретен» для каждого раздела.

Если вы считаете, что у вас может быть 3-й список в будущем, то вам лучше использовать свойство с числовым статусом, а в коде перечисление для каждого из состояний (или списков), в котором может находиться продукт. это делается, а не сортировка на bool.

Смежные вопросы