Attiva la richiesta Web quando l'utente scorre fino alla fine di UITableView
-
18-09-2019 - |
Domanda
sto cercando di far sì che un UIActivityIndicatorView "apparisca e si animi" quando un utente scorre fino alla fine di un UITableView….
Una volta raggiunta la parte inferiore della visualizzazione tabella, viene effettuata una richiesta Web che richiederà alcuni secondi per essere completata, quindi UIActivityIndicatorView dovrebbe "fermarsi e nascondersi"
Sto attivando l'aspetto di UIActivityIndicatorView utilizzando tableView:willDisplayCell:forRowAtIndexPath:
Voce dell'elenco
Ma il problema è che UIActivityIndicatorView non viene visualizzato sullo schermo dell'iPhone fino a quando non viene chiamato l'intero metodo (ad esempio, tableView:willDisplayCell:forRowAtIndexPath:) e a quel punto è già nascosto.
Qualche idea su come:
- mostra la vista dell'indicatore
- effettuare la richiesta web
- nascondere la vista dell'indicatore?
nuova discussione?modo migliore?
Grazie!!
nello specifico, la mia funzione è simile a questa
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
if (self.results && indexPath.row == [self.results count] - 1) {
[self.loadingSignal setHidden:NO]; // <====== my UIActivityIndicatorView is called "loadingSignal"
[self.loadingSignal startAnimating];
/// make web request that will take a few seconds
[self.loadingSignal setHidden:YES];
[self.loadingSignal stopAnimating];
}
}
}
Soluzione
Va bene.Dal tuo snippet di codice sopra, vedo alcuni problemi:
- Sembra che tu abbia intenzione di attendere il completamento della richiesta prima di visualizzare una cella.Questo ha alcuni punti negativi:è fastidioso per l'utente e molto probabilmente bloccherà l'interfaccia utente mentre la richiesta viene inviata (l'operazione potrebbe richiedere diversi secondi).
- Tutto accade all'interno del
willDisplayCell
metodo.
Ecco come penso che dovresti risolvere questo problema:
- Verrà visualizzato il caricamento del trigger della cella in modo asincrono.
- Visualizza una cella che dice "Caricamento in corso..." con il tuo spinner su di essa (vedi Tweetie 2 per l'ispirazione)
- Attendi la richiamata dalla tua richiesta
- Compila il tuo modello con la risposta
- Rimuovi la cella "Caricamento in corso...".
- Forza un ricaricamento dei tuoi dati
[tableView reloadData]
Ciò dovrebbe consentirti di ottenere ciò che desideri.
Altri suggerimenti
Puoi provare a farlo nel file cellForRowAtIndexPath: metodo di UITableView