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的主要内容,如果未能解决你的问题,请参考以下文章