Search code examples
swiftuitableviewreloaddata

UItableView not reloading data swift


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")

            }




        }

        }


    }
}

}


Solution

  • 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.