2017-02-08 8 views
0

このアプリは、ライダーがリクエストを受け入れる乗り物とドライバーを要求することを許可します。このテーブルビューには、ライダー(2)が要求したライドがあります。TableViewControllerがセルを更新していません

テーブルビューセルを更新できない場合は、のいずれかのヘルプに感謝します。

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に再ロードしてください。

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

ジオコーダからのコールバックは、非同期であり、あなたは単純にして、テーブルのセルの値を変更することはできませんコールバック内のラベル値を更新する - セルを更新するためにセルをリロードするようにテーブルビューに通知する必要があります。

したがって、viewView:cellForRowAt内からGeoCoderルックアップを取り出し、viewDidLoadまたはviewWillAppearのいずれかのループに移動する必要があります。最終的な値はあなたのモデルの一部を形成するはずです。

GeoCoderのコールバックの中で、tableView.reloadRowsを呼び出す個々のセルを単一の値の配列でリロードするようにテーブルビューに指示します。

+0

あなたは何を意味するのか分かりますか? – LizG

関連する問題