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!
This view controller is one of the several view controllers embedded in a UItabViewController. When the tab for this viewController is selected for the first time everything works fine, the data source is updating from the getOrdersByCustomer() and all the order cells are displayed. But when an order is placed from another view controller(another tab) and I navigate back to this view controller by using self.tabBarController?.selectedIndex = 2, I am getting the JSON for the new order which was placed from other view controller but the cell for this new order is not showing up.
when the following method is called from viewWillAppear the datasource is updating but the self.tableView.reloadData() doesn't seem to be working and the cell for the newly placed order doesn't show up.
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
}
Method in another 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")
}
}
}
}
}
}
The issue has to do with the getOrdersByCustomer()
. You are calling that method every time the view appears and adding the new records to the OrdersByCutomer
array. However you are not emptying the array each time so the first time you will see the initial "ten" records then the next time you will see "21" records with your newly added record being at the end.