ios - TableViewController 不更新单元格

标签 ios swift uitableview

此应用程序允许骑手叫车,司机可以接受请求。在这个表格 View 中是骑手 (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
}

**表格 View 的屏幕截图在第一个单元格后未更新**

enter image description here

最佳答案

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

关于ios - TableViewController 不更新单元格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42125801/

相关文章:

ios - 在 Firebase 中的对象数组中查找键

ios - 尝试在 Swift 中打印表情符号时打印额外的 unicode

swift - 在 Cocoa OS X AVPlayer 中播放 HLS (m3u8) - Swift

ios - 当用户在 Swift 中选择 UISegmentedControl 时,如何更改它的样式?

ios - 从对象数组中分组的 UITableView

json - 使用 JSON 数据填充表

iphone - 结合 GLKView 与 UIBUtton

ios - SpriteKit : How to animate drawing of a rounded rectangle

ios - 从标签栏 Controller 分支出来?

ios - 使用自定义表格 View 单元格从 UITextField 获取数据