gpt4 book ai didi

swift - UItableView 无法快速重新加载数据

转载 作者:行者123 更新时间:2023-11-30 12:32:52 32 4
gpt4 key购买 nike

class MyOrdersViewController:UITableViewController,GMSMapViewDelegate{


private var username = KeychainWrapper.standard.string(forKey: "username")


var googleStaticImages = [UIImage]()



var OrdersByCutomer = [Booking]()

var orderByCustomer: Booking! = Booking()

var driverPhotoUrlString: String!



var driverPhotoURL = [String]()


var refreshCtrl: UIRefreshControl!

该 View Controller 是嵌入在 UItabViewController 中的几个 View Controller 之一。当第一次选择此 viewController 的选项卡时,一切正常,数据源将从 getOrdersByCustomer() 进行更新,并且所有订单单元格都会显示。但是,当从另一个 View Controller (另一个选项卡)下订单并且我使用 self.tabBarController?.selectedIndex = 2 导航回到该 View Controller 时,我将获取从其他 View Controller 下的新订单的 JSON,但是此新订单的单元格未显示。

当从 viewWillAppear 调用以下方法时,数据源正在更新,但 self.tableView.reloadData() 似乎不起作用,并且新下订单的单元格不会显示。

func getOrdersByCustomer(){

if self.refreshCtrl.isRefreshing{

self.refreshCtrl.attributedTitle = NSAttributedString(string: "Refresh orders..")

}

ARSLineProgress.ars_showOnView(self.view)


Alamofire.request("http://www.*******************************************************ordersbyUser.php?", method: .get, parameters: ["username":username!], encoding: URLEncoding.default).responseString { response in
print(response.request ?? "") // original URL request
print(response.response ?? "") // URL response
print(response.data!) // server data
print(response.result) // result of response serialization

if let JSON = response.result.value {
print("Get Orders By User JSON: " , JSON)


var jsonObject: [AnyObject]!


do{
jsonObject = try JSONSerialization.jsonObject(with: response.data!, options:JSONSerialization.ReadingOptions.allowFragments) as? Array



print(jsonObject)

if jsonObject.isEmpty{

ARSLineProgress.hideWithCompletionBlock {

self.showAlertWithMessage(message: "No orders found.Use the Book Now tab to order!", ControllerTitle: "My Orders", ActionTitle: "OK")

if self.refreshCtrl.isRefreshing{
self.refreshCtrl.endRefreshing()
}


}

}


} catch let error as NSError {
print(error)

}

var jsonElement: [String:AnyObject]


for i in 0 ..< jsonObject.count
{


jsonElement = jsonObject[i] as! Dictionary





let staticUrl = jsonElement["staticurl"] as? String

let orderID = jsonElement["orderid"] as? String
let customerPrice = jsonElement["userprice"] as? String
let orderTime = jsonElement["order_time"] as? String
let orderStatus = jsonElement["stat"] as? String

let pickUpLatitude = jsonElement["plat"] as? String

let pickUpLongitude = jsonElement["plon"] as? String
let dropOffLatitude = jsonElement["dlat"] as? String

let dropOffLongitude = jsonElement["dlon"] as? String

let driverphotoURL = jsonElement["driver_photo"] as? String

print(jsonElement)



let booking = Booking()

booking.orderId = orderID!
booking.price = "₹" + customerPrice!
booking.pickUpTime = orderTime!
booking.status = orderStatus!
booking.pickUpLatitude = pickUpLatitude!
booking.pickUpLongitude = pickUpLongitude!
booking.dropOffLatitude = dropOffLatitude!
booking.dropOffLongitude = dropOffLongitude!
booking.staticUrl = staticUrl!

DispatchQueue.main.async{


self.OrdersByCutomer.append(booking)

if driverphotoURL != nil {

self.driverPhotoURL.append(driverphotoURL!)

self.refreshTable()

}


}

}

if self.refreshCtrl.isRefreshing{
self.refreshCtrl.endRefreshing()
self.refreshCtrl.attributedTitle = NSAttributedString(string: "Pull to refresh orders")
}

ARSLineProgress.hide()


}
}

}


func refreshTable(){

DispatchQueue.main.async {

self.tableView.reloadData()

}


}

override func numberOfSections(in tableView: UITableView) -> Int {

return 1
}


override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

return OrdersByCutomer.count


}


override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

print("CELL FOR ROW AT INDEX EXCECUTED")

self.orderByCustomer = self.OrdersByCutomer[(indexPath as NSIndexPath).row]

self.driverPhotoUrlString = self.driverPhotoURL[(indexPath as NSIndexPath).row]

let cell = tableView.dequeueReusableCell(withIdentifier: "MyOrdersCell", for: indexPath) as! MyOrdersCell


cell.contentView.layer.borderColor = UIColor.clear.cgColor

cell.contentView.layer.borderWidth = 10


let staticMapsURL = URL(string:orderByCustomer.staticUrl)

let p = Bundle.main.path(forResource: "39", ofType: "gif")!
let data = try! Data(contentsOf: URL(fileURLWithPath: p))

cell.googleStaticMapImageView.kf.indicatorType = .image(imageData: data)

cell.googleStaticMapImageView.kf.setImage(with: staticMapsURL)

// if driver photo is not available use default image

if driverPhotoUrlString.contains("600x300"){

cell.driverProfileImage.image = UIImage.init(named: "DriverImage.png")

cell.driverProfileImage.backgroundColor = UIColor.lightGray

}else{


let driverPhotoURL = URL(string: driverPhotoUrlString)

cell.driverProfileImage.kf.setImage(with: driverPhotoURL)

cell.driverProfileImage.kf.indicatorType = .activity

}

// make the driver profile picture cicular

cell.driverProfileImage.layer.borderWidth = 1
cell.driverProfileImage.layer.masksToBounds = false
cell.driverProfileImage.layer.borderColor = UIColor.black.cgColor
cell.driverProfileImage.layer.cornerRadius = cell.driverProfileImage.frame.height/2
cell.driverProfileImage.clipsToBounds = true



cell.orderIdLabel.text = orderByCustomer.orderId

cell.orderTimeLabel.text = orderByCustomer.pickUpTime


cell.userPriceLabel.text = orderByCustomer.price

cell.statusLabel.text = orderByCustomer.status



return cell



}



override func viewWillAppear(_ animated: Bool) {

super.viewWillAppear(true)

self.animateTable()

DispatchQueue.main.async {


self.getOrdersByCustomer()

}

print("ViewWillAppear")




}

override func viewDidLoad() {

super.viewDidLoad()

tableView.delegate = self
tableView.dataSource = self



print("ViewDidLoad")


self.refreshCtrl = UIRefreshControl()
self.refreshCtrl.addTarget(self, action: #selector(self.getOrdersByCustomer), for: .valueChanged)
self.refreshCtrl.attributedTitle = NSAttributedString(string: "Pull to refresh orders")
self.refreshControl = self.refreshCtrl


}

另一个 View Controller 中的方法

func transactionCompleted(withResponse response : NSDictionary,errorDescription error:NSError) -> Void {
self.dismiss(animated: true){

if response.count != 0{

print(response)
}

self.view.isUserInteractionEnabled = false

DispatchQueue.main.async {

self.submitBookingRequest(){(_status,_success) in



if _status == "yes"{

self.effectView.removeFromSuperview()

self.view.isUserInteractionEnabled = true

let alertController = UIAlertController(title: "Delivery", message: "Delivery order was placed successfull!", preferredStyle: UIAlertControllerStyle.alert)

let closeAction = UIAlertAction(title: "Ok", style: UIAlertActionStyle.cancel) { (alertAction) -> Void in


let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)

let bookNowViewController = mainStoryboard.instantiateViewController(withIdentifier: "ViewController2") as! BookNowViewController



self.tabBarController?.selectedIndex = 2


self.navigationController?.setViewControllers([bookNowViewController], animated: false)



}

alertController.addAction(closeAction)

self.present(alertController, animated: true, completion: nil)





}else{

self.effectView.removeFromSuperview()

self.showAlertWithMessage(message: "Problem placing the order!Please Contact Customer Care", ControllerTitle: "Order", ActionTitle: "Close")

}




}

}


}
}

}

最佳答案

该问题与 getOrdersByCustomer() 有关。每次出现 View 时都会调用该方法,并将新记录添加到 OrdersByCutomer 数组中。但是,您不会每次都清空数组,因此第一次您将看到最初的“10”条记录,然后下一次您将看到“21”条记录,新添加的记录位于末尾。

关于swift - UItableView 无法快速重新加载数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43266522/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com