[英]TableViewController not updating cells
此應用程序允許騎手請求乘車和司機接受請求。 在這個表格視圖中是騎手 (2) 要求的游樂設施。
無法更新 tableviewcell。
import UIKit
import Firebase
import FirebaseDatabase
import FirebaseAuth
import FirebaseCore
import CoreLocation
class RequestsTVC: UITableViewController {
var geoCoder : CLGeocoder?
var rideRequests = [FIRDataSnapshot]()
let ref = FIRDatabase.database().reference() //(withPath: "RideRequests")
override func viewDidLoad() {
super.viewDidLoad()
tableView.delegate = self
tableView.dataSource = self
self.geoCoder = CLGeocoder()
self.navigationController?.isNavigationBarHidden = false
/*
.observe is called whenever anything changes in the Firebase -
It's also called here in viewDidLoad().
It's always listening.
*/
ref.child("drivers").child("RideRequests").observe(FIRDataEventType.value, with: { snapshot in
self.rideRequests.removeAll()
for item in snapshot.children{
self.rideRequests.append(item as! FIRDataSnapshot)
}
self.rideRequests.reverse()
self.tableView.reloadData()
})
DispatchQueue.main.async (execute: { () -> Void in
self.tableView.reloadData()
})
} // func viewDidLoad()
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(true)
}
// MARK: - Table view data source
override func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return rideRequests.count
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "RequestsCell", for: indexPath)
let usernameLabel = cell.contentView.viewWithTag(2) as! UILabel
let locationLbl = cell.contentView.viewWithTag(1) as! UILabel
let destinationLbl = cell.contentView.viewWithTag(3) as! UILabel
let request = self.rideRequests[indexPath.row]
let username = request.childSnapshot(forPath: "username")
let destLatString = request.childSnapshot(forPath: "destLat").value
let destLat = Double(destLatString as! String)
let destLongString = request.childSnapshot(forPath: "destLong").value
let destLong = Double(destLongString as! String)
let usernameText = username.value as! String
let location = RiderVC.instance.locationManager.location
let destination = CLLocation(latitude: destLat!, longitude: destLong!)
usernameLabel.text = usernameText
locationLbl.text = "Waiting ..."
destinationLbl.text = "Loading ... "
// LOCATION and DESTINATION
geoCoder?.reverseGeocodeLocation(location!, completionHandler: { (data, error) -> Void in
guard let placeMarks = data as [CLPlacemark]! else {
return
}
let loc: CLPlacemark = placeMarks[0]
let addressDict : [NSString: NSObject] = loc.addressDictionary as! [NSString: NSObject]
let addrList = addressDict["FormattedAddressLines"] as! [String]
print(addrList)
locationLbl.text = addrList[0]
// THAT'S THE FIRST BIT DONE
// THIS IS STILL INSIDE THE COMPELTION HANDLER
// NOW DO DESTINATION
// DESTINATION
self.geoCoder?.reverseGeocodeLocation(destination, completionHandler: { (data, error) -> Void in
guard let placeMarks = data as [CLPlacemark]! else {
return
}
let loc: CLPlacemark = placeMarks[0]
let addressDict : [NSString: NSObject] = loc.addressDictionary as! [NSString: NSObject]
let addrList = addressDict["FormattedAddressLines"] as! [String]
destinationLbl.text = addrList[0]
})
})
return cell
}
**表格視圖的屏幕截圖在第一個單元格后未更新**
確保with parameter closure
在主隊列中重新加載 tableview。
ref.child("drivers").child("RideRequests").observe(FIRDataEventType.value, with: { snapshot in
self.rideRequests.removeAll()
for item in snapshot.children{
self.rideRequests.append(item as! FIRDataSnapshot)
}
self.rideRequests.reverse()
DispatchQueue.main.async (execute: { () -> Void in
self.tableView.reloadData()
})
})
Geocoder 的回調是異步的,您不能通過更新回調內的標簽值來簡單地更改表格單元格中的值 - 您必須通知表格視圖重新加載單元格才能更新它。
因此,您需要從 tableView:cellForRowAt 中提取 GeoCoder 查找並將它們移動到 viewDidLoad 或 viewWillAppear 中的循環中。 最終值應構成模型的一部分。
在 GeoCoder 的回調中,您將告訴表視圖使用單個值數組重新加載調用 tableView.reloadRows 的每個單獨的單元格。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.