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!
此视图控制器是嵌入在UItabViewController中的几个视图控制器之一。当第一次选择此viewController的选项卡时,一切正常,数据源将从getOrdersByCustomer()更新,并显示所有订单单元格。 但是当一个订单从另一个视图控制器(另一个选项卡)放置,我通过使用self.tabBarController?.selectedIndex = 2导航回这个视图控制器,我得到了从其他视图控制器放置的新订单的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
}
另一个视图控制器中的方法
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")
}
}
}
}
}
}
答案 0 :(得分:0)
viewDidLoad()
更改uitabbarcontroller中的选项卡时,不会重新运行。要查看其工作原理,请将打印件(“”)放入选项卡中显示的每个VC的viewDidLoad中 - 运行应用程序,您将看到它们在开始时都打印,而不是基于它们何时显示在屏幕上。
您可以使用NSNotificationCentre或某种侦听器来实现此目的。这是一个很好的库,或者你可以按照苹果文档。
https://github.com/100mango/SwiftNotificationCenter
您需要做的一般要点是在'order placed'函数上设置一个事件发射器,并在VC上设置一个显示订单的监听器。
答案 1 :(得分:0)
该问题与getOrdersByCustomer()
有关。每次出现视图时都在调用该方法,并将新记录添加到OrdersByCutomer
数组中。但是,每次都没有清空阵列,所以第一次看到最初的“十”记录时,下次你会看到“21”记录,新添加的记录在最后。