Wbrew temu, co może się wydawać intuicyjne, komórkę willDisplay: nazywa natychmiast po cellForRowAt indexPath: nazywa.
Posiadam aplikację, w której obrazy i filmy będą ładowane z adresu URLCache lub pobrane i wyświetlone w komórce. Zauważyłem, że za każdym razem, gdy uruchomiłem aplikację, wszystkie filmy i obrazy ładowały się, zanim mogłem je zobaczyć, i zauważyłem to, ponieważ mogłem usłyszeć dźwięk z ostatniego wideo w tableView, patrząc na pierwszy element w tableView. Jest to z 8 pozycji w tableView. Wydrukowałem na konsolę, aby lepiej zrozumieć kolejność wywołań funkcji delegatów.
Wyniki:
- Utworzono komórki w rzędzie 0
- Drew komórek pasza rzędu 0
- Utworzono komórki w rzędzie 1
- Drew komórek paszy w rzędzie 1
- Utworzony komórek w rzędzie 2
- Drew komórek pasza rzędu 2
- Utworzono komórki w rzędzie 3
- Drew komórek pasza wiersz 3
- Utworzono komórka w rzędzie 4
- Drew komórek pasza rzędu 4
- Utworzono komórki w rzędzie 5
- Drew komórek pasza rzędu 5
- Utworzono komórki w rzędzie 6
- Drew komórek pasza wiersz 6
- Utworzono komórkę w rzędzie 7
- Drew komórek pasza rzędu 7
- Zatrzymano pokazano komórek w rzędzie 2
- Zatrzymano pokazano komórki w rzędzie 3
- Zatrzymano pokazano komórki w rzędzie 4
- Zatrzymano pokazano komórki w rzędzie 5
- Zatrzymano wyświetlanie komórki w wierszu 6
- Zatrzymano wyświetlanie komórki w wierszu 7
Kod:
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "feedCell", for: indexPath) as! FeedCell
print("Created cell at row \(indexPath.row)")
let post = posts[indexPath.row]
cell.post = post
cell.viewController = self
cell.configureCell()
return cell
}
override func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
if let feedCell = cell as? FeedCell{
print("Drew feed cell at row \(indexPath.row)")
// only want download task to start when the cell will display
if feedCell.post.isVideo {
feedCell.loadVideo()
} else {
feedCell.loadImage()
}
}
}
override func tableView(_ tableView: UITableView, didEndDisplaying cell: UITableViewCell, forRowAt indexPath: IndexPath) {
print("Stopped showing cell at row \(indexPath.row)")
if let feedCell = cell as? FeedCell{
feedCell.player?.pause()
}
}
podobna do 'viewWillAppear' i' viewDidlAppear'. –
Dobra odpowiedź! Obaj są tacy podobni! – mayqiyue
Zasadniczo udostępniasz komórkę systemowi w 'cellForRowAtIndexPath' (konfiguracje są do ciebie), ale' willDisplayCell: forRowAtIndexPath: 'jest sposobem, gdy system wysyła komórkę do ciebie, jeśli chcesz dokonać ostatniej zmiany czasu (znowu do ciebie). –