2013-07-03 11 views
6

Jak Apple Doc powiedziałcellForRowAtIndexPath nie nazywa po reloadRowsAtIndexPaths

Przeładunki wiersz powoduje, że widok tabeli zadać swoje źródło danych dla nowego komórki dla tego wiersza.

połączyć UITableView z NSFetchedResultsController:

- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller 
{ 
    if (self.tableView.isEditing) 
    { 
     [self.tableView setEditing:NO animated:YES]; 
    } 
    [self.tableView beginUpdates]; 
} 

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller 
{ 
    [self.tableView endUpdates]; 

    [self updateTabItemBadge]; 
    [self.noDataView setHidden:![self isNoData]]; 

    WXINFO(@"controllerDidChangeContent"); 
} 

Pomiędzy tymi dwoma funkcjami, to przeładowanie komórki docelowe:

enter image description here

case NSFetchedResultsChangeUpdate: { 
     if (indexPath) { 
      [tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationNone]; 
     } 

enter image description here

Ustawiam punkt przerwania w linii 1563, aby sprawdzić, czy został wywołany reloadRowsAtIndexPaths, ale potem nie został wywołany - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath.

Moja komórka nie mogła zostać zaktualizowana.

Ktoś może mi powiedzieć, dlaczego? Dzięki.

+0

Ponowne ładowanie komórki docelowej? To jest coś, o czym nigdy nie słyszałem. Nawet w Visual Basic ... –

+0

Metoda, w której wywołujesz 'reloadRowsAtIndexPaths: withRowAnimation:' to 'controller: didChangeObject: atIndexPath: forChangeType: newIndexPath:'? – leoformaggio

+0

@leoformaggio tak, oczywiście. –

Odpowiedz

0

Czy możesz sprawdzić, ponownie ładując widok tabeli za pomocą [tableView reloadData]?

Jeśli chcesz aktualizować tylko jeden wiersz bez ponownego ładowania tabeli, sprawdź typ "indexPath". Powinna to być NSIndexPath.

+0

Wydruk 'lldb' pokazuje, że' indexPath' jest 'NSIndexPath'. – leoformaggio

+0

Ten interfejs API działa dla mnie. Jednym z możliwych powodów, dla których zaobserwowałem, jest to, że cellForRowAtIndexPath nie jest wywoływane, gdy indexPath jest zerowe. – Anand

+0

Tak, dla mnie też. Ale wydaje się, że jest to poprawna 'indexPath'. Bardzo dziwne .. – leoformaggio

0

zawinąć go w:

[tableView beginUpdates]; 
[tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationNone]; 
[tableView endUpdates]; 
+1

między kontroleremWillChangeContent i controllerDidChangeContent, istnieją 'beginUpdates' i 'endUpdates' –

0

Jedynym niezawodnym sposobem znalazłem to zrobić za pomocą animacji inne niż żaden. Jeśli określona jest jakakolwiek inna animacja, ponowne ładowanie odbywa się poprawnie.

0

To jest praca dookoła, ale zrobiłem to.

func tableView(_ tableView: UITableView, commit editingStyle: 
    UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) { 
     if editingStyle == UITableViewCellEditingStyle.delete { 
      if itemDetailDict.count - 1 <= 0 { 
       self.mainTable.beginUpdates() 
       let cellOne = self.mainTable.cellForRow(at: indexPath) 
       cellOne?.textLabel?.text = "There are no items." 
       self.mainTable.reloadRows(at: [indexPath], with: .automatic) 
       self.mainTable.endUpdates() 
      } else { 
       self.mainTable.beginUpdates() 
       let removeKey = Array(itemDetailDict.keys)[indexPath.row] 
       itemDetailDict.removeValue(forKey: removeKey) 
       mainTable.deleteRows(at: [indexPath], with: .automatic) 
       self.mainTable.endUpdates() 
      } 
     } 
    } 

Zasadniczo funkcję usuwania wierszy Chciałam użytkownik, aby móc usunąć wiersz, ale gdy tylko jeden wiersz pozostał, chciałem pokazać komunikat domyślny w komórce tableview.

W tym celu zaktualizowałem źródło danych, a gdy nie było już żadnych danych w słowniku, zaktualizowałem komórkę, aby wyświetlić tekst, ponownie załadowałem komórkę, a następnie nazwano endUpdating na moim widoku tabeli.

Mam nadzieję, że to pomoże.

Powiązane problemy