2017-02-08 4 views
0

Mit dieser App kann der Fahrer eine Fahrt und einen Fahrer anfordern, um die Anfrage zu akzeptieren. In dieser Tabellenansicht sind die Fahrten, die die Fahrer (2) angefordert haben.TableViewController aktualisiert die Zellen nicht

Kann Tabellenzeilen nicht aktualisieren, jede Hilfe wäre wünschenswert.

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 
} 

** Screenshot der Tabellenansicht nicht nach dem ersten Zelle Aktualisierung **

enter image description here

Antwort

1

Stellen Sie sicher, dass Sie Tabellenansicht in der Hauptwarteschlange in with parameter closure neu laden.

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

Die Rückrufe von Geocoder sind asynchron und Sie können nicht einfach die Werte in den Tabellenzellen ändern, indem Aktualisieren der Label-Werte innerhalb des Callbacks - Sie müssen die Tabellenansicht informieren, um die Zelle neu zu laden, um sie zu aktualisieren.

Sie müssen also die GeoCoder-Lookups aus tableView: cellForRowAt herausziehen und sie entweder in viewDidLoad oder viewWillAppear in eine Schleife verschieben. Die endgültigen Werte sollten Teil Ihres Modells sein.

In den Callbacks für den GeoCoder würden Sie dann die Tabellenansicht anweisen, jede einzelne Zelle, die tableView.ReloadRows aufruft, mit einem einzelnen Wertearray neu zu laden.

+0

Jede Chance, Sie könnten mir ein Beispiel geben, was Sie meinen? – LizG

Verwandte Themen