从API调用

时间:2019-04-17 06:35:43

标签: ios swift api uitableview alamofire

我是ios开发的新手,在将数据从API调用加载到UITableView时遇到问题。该应用将用作订购系统。为了将数据获取到tableView的每个单元中,我在viewController上有一个按钮,该按钮发送带有项目ID的发布请求,该ID与服务器内存中的项目匹配。我有一个视图控制器,它具有当前已订购商品的tableView,这是我的问题所在。

我还有另外两个视图控制器(BeerListTableViewControllerCocktailListTableViewController),其中的tableViews装有可以订购的项目。这些tableViews正确加载了它们各自的项目。当按下任一tableView中的单元格时,我将对另一个viewController(BeerDetailViewControllerCocktailDetailViewController)执行搜索,在其中显示项目并显示“下订单”按钮。下订单按钮将项目发送到服务器,然后将其添加到订单数组,然后将popViewController返回到tableView。我已验证各项已正确添加。在BeerListTableViewControllerCocktailListTableViewController中,我都添加了一个barButtonItem“ Orders”,它与DrinkOrderTableView相连,这就是我的问题所在。在此表中,仅显示来自BeerDetailViewController的订单。我已经包含了xcode项目和节点index.js文件中的代码。任何帮助深表感谢! screenshot of storyboard

class DrinkOrdersTableViewController: UITableViewController {

    var orders: [Order] = []

    override func viewDidLoad() {
        super.viewDidLoad()
        navigationItem.title = "Current Orders"

        fetchAllCurrentOrders { orders in
            self.orders = orders!
            print(self.orders)
            self.tableView.reloadData()
        }

    }

    private func fetchAllCurrentOrders(completion: @escaping([Order]?) -> Void) {
        Alamofire.request("http://127.0.0.1:4000/orders", method: .get)
            .validate()
            .responseJSON { response in
                guard response.result.isSuccess else { return completion(nil) }
                guard let rawInventory = response.result.value as? [[String: Any]?] else { return completion(nil) }
                let currentOrders = rawInventory.compactMap { ordersDict -> Order? in
                    guard let orderId = ordersDict!["id"] as? String,
                        let orderStatus = ordersDict!["status"] as? String,
                        var pizza = ordersDict!["pizza"] as? [String: Any] else { return nil }
                    pizza["image"] = UIImage(named: pizza["image"] as! String)

                    return Order(
                        id: orderId,
                        pizza: Pizza(data: pizza),
                        status: OrderStatus(rawValue: orderStatus)!
                    )

                }
                completion(currentOrders)
        }
    }

    @IBAction func closeButtonPressed(_ sender: Any) {
        dismiss(animated: true, completion: nil)
    }
    override func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }
    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        print("Debugging ROWS", orders.count)
        return orders.count
    }
    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "order", for: indexPath)
        let order = orders[indexPath.row]
        cell.textLabel?.text = order.pizza.name
        cell.imageView?.image = order.pizza.image
        cell.detailTextLabel?.text = "$\(order.pizza.amount) - \(order.status.rawValue)"
        return cell
    }
    override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        return 100.0
    }
    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        performSegue(withIdentifier: "orderSegue", sender: orders[indexPath.row] as Order)
    }
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "orderSegue" {
            guard let vc = segue.destination as? OrderViewController else { return }
            vc.order = sender as? Order
        }
    }
}

链接到server code

链接到issue的屏幕截图

0 个答案:

没有答案