TableView 没有加载任何 JSON 数据 Swift 4

Posted

技术标签:

【中文标题】TableView 没有加载任何 JSON 数据 Swift 4【英文标题】:TableView is not loading any JSON data Swift 4 【发布时间】:2017-12-26 00:10:02 【问题描述】:

我花了大约三周的时间试图弄清楚这一点。我可以查看要查看的部分标题,但没有显示任何 JSON 数据。当我执行文件中包含的标准“数组”时,它会显示。

我已经遵循了那里的每一个提示和技巧,但我被困住了。

我认为这可能与 AnyObject 和 String 有关,但我遗漏了一些东西。请参阅下面的代码:

import UIKit
import Alamofire
import SwiftyJSON

class UserTableViewCell: UITableViewCell 

   @IBOutlet weak var userFirstname: UILabel!
   @IBOutlet weak var userLastname: UILabel!


class Profile2VC: UITableViewController 

    @IBOutlet var userTable: UITableView!

var usertitles = ["First Name", "Last Name", "Email", "Mobile Number"]
var userinfo = [[String:AnyObject]]() //Array of dictionary

override func viewDidLoad() 
    super.viewDidLoad()

    let defaultValues = UserDefaults.standard
    let URL_USER_LOGIN = "https://www.myapp.com/myphp.php"
    let userid = "13"
    let parameters: Parameters=["id":coolid]

    Alamofire.request(URL_USER_LOGIN, method: .get, parameters: 
parameters).responseJSON  (responseData) -> Void in
        if((responseData.result.value) != nil) 
            let swiftyJsonVar = JSON(responseData.result.value!)
               print(swiftyJsonVar)

            if let userData = swiftyJsonVar["user"].arrayObject 
                self.userinfo = userData as! [[String:AnyObject]]
               //debugPrint(userData)
            

            if self.userinfo.count > 0 
                self.userTable.reloadData()
            
        
    
    self.userTable.reloadData()

    // Uncomment the following line to preserve selection between 
presentations
    // self.clearsSelectionOnViewWillAppear = false

    // Uncomment the following line to display an Edit button in the 
navigation bar for this view controller.
    // self.navigationItem.rightBarButtonItem = self.editButtonItem


// MARK: - Table view data source


override func numberOfSections(in tableView: UITableView) -> Int 
    // #warning Incomplete implementation, return the number of sections
    return 1



override func tableView(_ tableView: UITableView, numberOfRowsInSection 
section: Int) -> Int 
    // #warning Incomplete implementation, return the number of rows
     return userinfo.count


override func tableView(_ tableView: UITableView, titleForHeaderInSection 
section: Int) -> String? 
    return "Section \(section)"


override func tableView(_ tableView: UITableView, cellForRowAt indexPath: 
IndexPath) -> UITableViewCell 
    let cell = tableView.dequeueReusableCell(withIdentifier: "LabelCell", 
for: indexPath) as! UserTableViewCell
  //let userTitles = usertitles[indexPath.row]
    let userInfo = userinfo[indexPath.row]
    cell.userFirstname?.text = userInfo["first_name"] as? String
    cell.userLastname?.text = userInfo["last_name"] as? String
  //cell.imageView?.image = UIImage(named: fruitName)
  //cell.textLabel?.text = usertitles[indexPath.row]

    return cell


【问题讨论】:

您需要在请求闭包内部而不是外部重新加载数据。您可能还需要在主队列上调度重新加载 在github上分享repo,我看看这个 @MauricioChirino 由于保密 NDA 协议,我不能这样做。我可以在这里发布这段代码。 @Paulw11 所以我需要使用带有 catch let 的调度主队列外壳?我之前有过,json数据也没有解析 你做了什么调试?你是你的cellForRowAt 吗? Xcode 有一个强大的调试器。您可以设置断点并单步执行代码以准确查看发生了什么。 【参考方案1】:

首先,您需要在主队列中重新加载表格视图。检查以下代码:

DispatchQueue.main.async 
    self.userTable.reloadData()

而且您多次重新加载它并不好,因此删除不需要的重新加载代码,您的最终代码将是:

Alamofire.request(URL_USER_LOGIN, method: .get, parameters:  parameters).responseJSON  (responseData) -> Void in
        if((responseData.result.value) != nil) 
            let swiftyJsonVar = JSON(responseData.result.value!)
               print(swiftyJsonVar)

            if let userData = swiftyJsonVar["user"].arrayObject 
                self.userinfo = userData as! [[String:AnyObject]]
               //debugPrint(userData)
            

            if self.userinfo.count > 0 
                DispatchQueue.main.async 
                    self.userTable.reloadData()
                
            
        
    
    //self.userTable.reloadData() //Remove this code

一旦您的 API 调用完成,请确保 debugPrint(userData) 正在打印一些数据,然后在您重新加载 userTable 时在 cellForRowAt 中放置一个断点并确认它正在调用。

如果它的调用和数据来自服务器,你就可以走了。

但是如果 cellForRowAt 方法没有被调用,那么你需要检查你的 userTable DataSource 和 Delegate 是否正确连接。

【讨论】:

我在 cellForRowAt 添加了断点,但它没有做任何事情。打开 debugPrint 确实可以正常工作,它打印出 .似乎确实在获取 json。但是表格仍然没有显示任何数据。我在 Xcode 中选择的所有调试选项都表明它工作正常,JSON 正在输入数组,但它只是没有显示在表格中。我正在考虑清除 VC 并从静态单元重新开始。 你能分享它的演示项目吗?【参考方案2】:

试试这个代码:

let API = URL(string:"http://www.myapp.com/myphp.php")
    let request = URLRequest(url:API!)
    let task = URLSession.shared.dataTask(with: request, completionHandler:  (data, response, error) in
        if let data = data 
            if String(data: data, encoding: String.Encoding.utf8) != nil 
                let data = data
                let json = try? JSONSerialization.jsonObject(with: data, options: [])
                let jsonData = json as! [[String:Any]]

            DispatchQueue.main.sync 

                let user = jsonData.flatMap  $0["user"] as? String 
                print(user)

                self.annocumentTableView.reloadData()
            
        
    
)
task.resume()

【讨论】:

感谢您提供此信息,但我将 Alamofire 代码放在哪里?我需要根据特定条件获取请求。

以上是关于TableView 没有加载任何 JSON 数据 Swift 4的主要内容,如果未能解决你的问题,请参考以下文章

Tableview没有重新加载数据

将 Json 数据加载到 TableView 中

JSON请求后以编程方式TableView不会重新加载数据

为啥我用这些代码得到一个空的 Tableview? JSON

未在 TableView 中重新加载正确的数据

获取异步 JSON 数据后重新加载 tableview