2013-07-03 9 views
6

Come Apple Doc detto,cellForRowAtIndexPath non è chiamato dopo reloadRowsAtIndexPaths

ricaricamento fila provoca la visualizzazione tabella per chiedere la sua origine dati per un nuovo cella per quella riga.

I combinano UITableView con 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"); 
} 

Tra queste due funzioni, ricarico della cellula bersaglio:

enter image description here

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

enter image description here

Ho impostato un punto di interruzione su Line1563, per verificare che sia stato chiamato il reloadRowsAtIndexPaths, ma successivamente non è stato chiamato - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath.

Quindi, la mia cella non può essere aggiornata.

Qualcuno può dirmi perché? Grazie.

+0

Ricaricare la cella di destinazione? È qualcosa di cui non ho mai sentito parlare. Neanche in Visual Basic ... –

+0

Il metodo in cui stai chiamando 'reloadRowsAtIndexPaths: withRowAnimation:' è 'controller: didChangeObject: atIndexPath: forChangeType: newIndexPath:'? – leoformaggio

+0

@leoformaggio si, certo. –

risposta

0

Potresti verificare ricaricando la vista tabella utilizzando [tableView reloadData]?

Se si desidera aggiornare solo una riga senza ricaricare la tabella, controllare il tipo 'indexPath'. Dovrebbe essere NSIndexPath.

+0

La stampa 'lldb' sta mostrando che' indexPath' è un 'NSIndexPath'. – leoformaggio

+0

Questa API funziona per me. Una possibile ragione che ho osservato è che cellForRowAtIndexPath non viene chiamato quando indexPath è nullo. – Anand

+0

Sì, anche per me. Ma sembra essere un 'indexPath' valido. Molto strano .. – leoformaggio

0

avvolgerla in:

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

tra controllerWillChangeContent e controllerDidChangeContent, ci sono 'beginUpdates' e 'endUpdates' –

0

L'unico modo affidabile che ho trovato per fare questo è quello di utilizzare un'animazione diversa da nessuno. Se viene specificata un'altra animazione, la ricarica avviene correttamente.

0

Questo è un lavoro che ho fatto, ma ha funzionato.

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() 
      } 
     } 
    } 

essenzialmente la funzione di eliminazione fila ho voluto l'utente sia in grado di eliminare la riga, ma quando una sola fila rimaneva, ho voluto mostrare un messaggio predefinito nella cella di tableView.

Per fare ciò, ho aggiornato l'origine dati e quando non c'erano più dati nel dizionario, ho aggiornato la cella per visualizzare il testo, ho ricaricato la cella, quindi ho chiamato endUpdating sul mio tableview.

Spero che questo aiuti.

Problemi correlati