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

时间:2017-12-26 00:10:03

标签: ios json swift uitableview

我花了大约三个星期试图解决这个问题。我可以查看节标题,但没有显示任何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
}
}

2 个答案:

答案 0 :(得分:0)

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

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数据源和代理是否正确连接。

答案 1 :(得分:0)

试试这段代码:

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