TableViewController不更新单元格
问题描述:
此应用程序允许骑手请求骑车和司机接受请求。在这张桌子里,是骑手(2)要求的骑行。TableViewController不更新单元格
无法更新tableviewcells,任何帮助将不胜感激。
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()
})
})
答
从地理编码器的回调异步和你不能简单地更改表格单元格的值更新回调中的标签值 - 您必须通知表视图重新加载单元格以更新它。
因此,您需要从tableView:cellForRowAt中取出GeoCoder查找并将它们移到viewDidLoad或viewWillAppear中的循环中。最终值应该成为你模型的一部分。
在GeoCoder的回调函数中,您可以通过表视图重新载入每个调用tableView.reloadRows的单个值单元值。
你有什么可以给我一个你的意思吗? – LizG