TableViewController不更新单元格 [英] TableViewController not updating cells

查看:79
本文介绍了TableViewController不更新单元格的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

此应用程序允许Rider请求乘车,驾驶员接受请求.在此表视图中,是骑手(2)所请求的游乐设施.

This app allows Rider to request a ride and driver to accept the request. In this tableview are the rides the riders (2) have requested.

无法更新tableviewcell.

Unable to update 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
}

**表格视图的屏幕快照在第一个单元格之后没有更新**

**Screen shot of table view not updating after 1st cell **

推荐答案

确保在with parameter closure的主队列中重新加载tableview.

make sure you reload tableview in main queue in 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()
    })
})

这篇关于TableViewController不更新单元格的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆