2017-02-08 87 views
0

此应用程序允许骑手请求骑车和司机接受请求。在这张桌子里,是骑手(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 
} 

**表视图的屏幕快照第一小区后不更新**

enter image description here

回答

1

请确保您在主队列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() 
    }) 
}) 
0

从地理编码器的回调异步和你不能简单地更改表格单元格的值更新回调中的标签值 - 您必须通知表视图重新加载单元格以更新它。

因此,您需要从tableView:cellForRowAt中取出GeoCoder查找并将它们移到viewDidLoad或viewWillAppear中的循环中。最终值应该成为你模型的一部分。

在GeoCoder的回调函数中,您可以通过表视图重新载入每个调用tableView.reloadRows的单个值单元值。

+0

你有什么可以给我一个你的意思吗? – LizG

相关问题