5

Esiste un modo per aggiornare una sezione e una riga di UITableView dopo aver modificato il predicato di recupero dei risultati (e l'esecuzione del recupero)? Vorrei usare i metodi del delegato controllerWillChangeContent per aggiornare la mia tabella quando il searchText nella mia barra di ricerca è cambiato.Usa NSFetchedResultsControllerDelegate per aggiornare le sezioni e le righe di TableView dopo la modifica di NSPredicate

Attualmente nella mia app, questi metodi delegati vengono richiamati solo quando si verificano cambiamenti nei coredati. Non quando si modifica il risultato del predicato del controllore & eseguendo il recupero.

Se chiamo semplicemente [self.tableView reloadData] su ogni scambio di testo, non ci sono animazioni e blocca l'esperienza un po '.

O dovrei fare qualcosa di completamente diverso per aggiornare il contenuto della tabellaView su ogni cambio di testo di ricerca?

risposta

7

che ho avuto un altro sguardo nella documentazione di Apple e sembra che i metodi NSFetchedResultsControllerDelegate non vengono chiamati quando un predicato è cambiato:

Un'istanza di NSFetchedResultsController utilizza metodi in questo protocollo a notificare la sua delegare che i risultati del recupero del controller siano stati modificati a causa di un'operazione di aggiunta, rimozione, spostamento o aggiornamento di .

Quindi, per rispondere alla mia domanda: Non è possibile utilizzare NSFetchedResultsControllerDelegate per aggiornare la tabella dopo NSFetchedResultsController modifiche predicato.

+0

Un approccio alternativo potrebbe essere quello di riformulare il problema in modo tale che la modifica della query sia in realtà una modifica dei dati. Ho provato alcune cose con proprietà e relazioni recuperate su un oggetto "query" centrale utilizzato nel predicato, che poi cambierei, ma Core Data non lo compra. Rivaluta qualsiasi cosa solo se aggiorno le entità stesse. – mvds

+0

Thnx. Lo esaminerò. – P5ycH0

0

tenta di chiamare [self.tableView reloadData] in

-(void)viewWillAppear:(BOOL)animated; 
       or 
-(void)viewDidAppear:(BOOL)animated; 
+0

Questo non risolverà il mio problema perché la vista è già sullo schermo. – P5ycH0

0

Si potrebbe provare a utilizzare il metodo di UITableViewreloadSections:withRowAnimation: passando in un NSIndexSet con tutte le sezioni. In questo modo dovresti ricaricare tutto ma ottenere l'animazione della tua scelta.

Se si aggiungono e si rimuovono righe, sarà necessario utilizzare insertSections:withRowAnimation: e removeSections:withRowAnimation:. Se stai eseguendo una serie di modifiche contemporaneamente, dovresti eseguirle anche tra le chiamate su beginUpdates e endUpdates.

+0

La mia funzione di ricerca cambia anche il nr delle sezioni nella tabellaView. Se utilizzo le reloadSections ottengo un errore come --- "Il numero di sezioni contenute nella vista tabella dopo l'aggiornamento (1) deve essere uguale al numero di sezioni contenute nella vista tabella prima dell'aggiornamento (61)" - - Come dovrei affrontarlo? – P5ycH0

+0

Inoltre, perché i metodi NSFetchedResultsControllerDelegate "doneChangeSection" e "didChangeObject" sono stati richiamati quando il fetchedResultsController viene modificato da una richiesta di prelievo NSP e di esecuzione? Questi metodi hanno i metodi deleteSections e insertSections che dovrebbero occuparsi delle modifiche. – P5ycH0

+0

Credo che i metodi delegati vengano chiamati solo come risultato di una modifica nel livello del modello (ad esempio quando salva: viene richiamato nel contesto dell'oggetto gestito). – extremeboredom

0

Da NSFetchedResultsController Classe Riferimento:

Modifica della richiesta di ricupero

Non si può semplicemente cambiare la richiesta di recupero per modificare i risultati. Se si desidera modificare la richiesta di recupero, è necessario:

Se si utilizza una cache, eliminarla (utilizzando deleteCacheWithName :). In genere non si dovrebbe usare una cache se si sta modificando la richiesta di recupero.

Modificare la richiesta di recupero. Richiamare performFetch :.

Dato che il predicato è stato modificato, è necessario chiamare performFetch: ancora una volta, quindi il delegato gestirà l'aggiornamento della tabella da lì.

+0

Grazie per la vostra risposta. La mia ricerca funziona bene. Pulisco la cache, imposto il predicato ed eseguo il recupero. Sfortunatamente, ho bisogno di fare un refresh di tableView per vedere i risultati. Ora sto cercando un modo per aggiornare solo le sezioni e le righe rimosse/aggiunte nel TableView. NSFetchedResultsControllerDelegate funziona anche per me quando inserisco i dati nei dati principali. Ma sono perplesso sul motivo per cui i metodi delegati non si attivano quando eseguo una nuova richiesta con un nuovo predicato. – P5ycH0

+0

Questo non sembra essere corretto. Devo ricaricare i dati dopo eseguire il recupero anche con una cache nil. –

+0

@BobSpryn È necessario inviare '-reloadData' alla vista tabella se non si sta implementando il delegato NSFRC. –

Problemi correlati