Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios TableViewController不更新单元格_Ios_Swift_Uitableview - Fatal编程技术网

Ios TableViewController不更新单元格

Ios TableViewController不更新单元格,ios,swift,uitableview,Ios,Swift,Uitableview,此应用程序允许骑手请求骑乘,并允许驾驶员接受请求。在此表视图中,是骑手(2)要求的骑乘 无法更新tableviewcells import UIKit import Firebase import FirebaseDatabase import FirebaseAuth import FirebaseCore import CoreLocation class RequestsTVC: UITableViewController { var geoCoder : CLGeocoder? v

此应用程序允许骑手请求骑乘,并允许驾驶员接受请求。在此表视图中,是骑手(2)要求的骑乘

无法更新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
}
**表格视图在第一个单元格后未更新的屏幕截图**


来自Geocoder的回调是异步的,您不能简单地通过更新回调中的标签值来更改表单元格中的值-您必须通知表视图重新加载单元格以更新它

因此,您需要从tableView:cellForRowAt内部拉出GeoCoder查找,并将它们移动到viewDidLoad或ViewWillDisplay中的循环中。最终值应构成模型的一部分


然后,在GeoCoder的回调中,您将告诉表视图重新加载调用tableView.reloadRows的每个单独单元格,并使用单值数组。

确保使用参数闭包在主队列中重新加载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()
    })
})

你能给我举个例子说明你的意思吗?