未从 Web 服务获取 UITableView 中的数据

Posted

技术标签:

【中文标题】未从 Web 服务获取 UITableView 中的数据【英文标题】:Not getting data in UITableView from web service 【发布时间】:2017-08-18 07:43:41 【问题描述】:

我对快速处理请求和响应还很陌生。这是我一直坚持的代码。我从 dataArray 中的 web 服务获取值,但没有加载到 tableview 中。请有人帮忙。

import UIKit
import Foundation
import Alamofire
import SwiftyJSON

class AddOnsViewController: UIViewController, UITableViewDelegate, UITableViewDataSource 

    @IBOutlet weak var tableView: UITableView!

    var dataArray = [AnyObject]()
    var addOnsURL = "http://econstrademosite.com/food_delivery/?****************"

    override func viewDidLoad() 
        super.viewDidLoad()
        self.automaticallyAdjustsScrollViewInsets = false
        self.tableView.reloadData()
        callData()
    

    @IBAction func goBackToHome(sender: UIBarButtonItem)

        let vc = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "base") as! SWRevealViewController
        self.present(vc, animated: true, completion: nil)
    

    func callData()

        Alamofire.request(addOnsURL).responseJSON  response in

            let result = response.result
            if let dict = result.value as? Dictionary<String, AnyObject>
                if let innerDict = dict["data"]?["result"]
                    self.dataArray = innerDict as! [AnyObject]
                    print(self.dataArray)
                
            
        
    

    func numberOfSections(in tableView: UITableView) -> Int 
        return 1
    

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
        print(dataArray.count)
        return dataArray.count
    

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! exampleTableViewCell
        let itemName = dataArray[indexPath.row]["item_name"]
        cell.label.text! = itemName as! String

        return cell
    


【问题讨论】:

我认为您需要在请求关闭时重新加载表格视图。 @koropok 你是对的 是的.. 非常感谢.. 成功了.. 需要在请求关闭时重新加载.. @K.Mitra - 接受任何一个答案 【参考方案1】:
    func callData()

        Alamofire.request(addOnsURL).responseJSON  response in

            let result = response.result
            if let dict = result.value as? Dictionary<String, AnyObject>
                if let innerDict = dict["data"]?["result"]
                    self.dataArray = innerDict as! [AnyObject]
                    print(self.dataArray)
                 if self.dataArray.count > 0
                  
                    self.tableView.reloadData()
                  
                
            
        
    

【讨论】:

【参考方案2】:

不要忘记为您的tableView 添加delegatedataSource

override func viewDidLoad() 
        super.viewDidLoad()
        self.automaticallyAdjustsScrollViewInsets = false
        self.tableView.delegate = self
        self.tableView.dataSource = self
        callData()
    

然后在获取数据后重新加载tableView:

func callData()

    Alamofire.request(addOnsURL).responseJSON  response in

        let result = response.result
        if let dict = result.value as? Dictionary<String, AnyObject>
            if let innerDict = dict["data"]?["result"]
                self.dataArray = innerDict as! [AnyObject]
                print(self.dataArray)
                self.tableView.reloadData() // you missing this method
            
        
    

【讨论】:

我已经在视图中添加了委托和数据源。谢谢它的工作。我在错误的地方使用了重新加载方法。【参考方案3】:

您需要更改您的 tableview.reloadData() 调用。一旦在 api 调用后得到响应并且您将响应存储在 dataArray 中,您就可以重新加载表。

因此,在您的情况下,在 viewDidLoad() 中重新加载 tableview 是没有意义的,因为您的 dataArray 是空的。

所以请像这样更改callData()方法

func callData()

    Alamofire.request(addOnsURL).responseJSON  response in

        let result = response.result
        if let dict = result.value as? Dictionary<String, AnyObject>
            if let innerDict = dict["data"]?["result"]
                self.dataArray = innerDict as! [AnyObject]
                print(self.dataArray)
            
        
    

【讨论】:

以上是关于未从 Web 服务获取 UITableView 中的数据的主要内容,如果未能解决你的问题,请参考以下文章

服务器未从 restkit 的 web 服务调用接收正文对象

在同步 Web 服务数据上添加 UIActivityIndi​​catorView 并填充 UITableView

UIImageView+AFNetworking 未从服务器检索最新图像

Tomcat 6 未从 WEB-INF/lib 加载 jars

Firebase admob 未从 pod 或服务器获取最新的 google ad mob SDK

未从响应标头中的后端获取 JWT 令牌