UItableView没有重新加载数据swift

时间:2017-04-06 22:04:38

标签: swift uitableview reloaddata

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

            }




        }

        }


    }
}

}

2 个答案:

答案 0 :(得分:0)

viewDidLoad()
更改uitabbarcontroller中的选项卡时,

不会重新运行。要查看其工作原理,请将打印件(“”)放入选项卡中显示的每个VC的viewDidLoad中 - 运行应用程序,您将看到它们在开始时都打印,而不是基于它们何时显示在屏幕上。

您可以使用NSNotificationCentre或某种侦听器来实现此目的。这是一个很好的库,或者你可以按照苹果文档。

https://github.com/100mango/SwiftNotificationCenter

您需要做的一般要点是在'order placed'函数上设置一个事件发射器,并在VC上设置一个显示订单的监听器。

答案 1 :(得分:0)

该问题与getOrdersByCustomer()有关。每次出现视图时都在调用该方法,并将新记录添加到OrdersByCutomer数组中。但是,每次都没有清空阵列,所以第一次看到最初的“十”记录时,下次你会看到“21”记录,新添加的记录在最后。