在 UITableView 中显示来自 JSON 的数据
Posted
技术标签:
【中文标题】在 UITableView 中显示来自 JSON 的数据【英文标题】:Show data from JSON in UITableView 【发布时间】:2019-04-01 08:28:40 【问题描述】:.................................................. ..................................................... ..................................................... ..................... 我得到数据并打印出来。也许代码不正确我只是 swift 的新手,但我在 Xcode 中没有任何错误。缺少一些东西,但我只是不知道是什么。 导入 UIKit
class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate
struct Class: Codable
let first_name: String
let last_name: String
let email: String
enum CodingKeys: String, CodingKey
case first_name = "first_name"
case last_name = "last_name"
case email = "email"
@IBOutlet weak var tableview: UITableView!
override func viewDidLoad()
super.viewDidLoad()
let url = URL(string: "https://x.de/x.php")
URLSession.shared.dataTask(with: url!, completionHandler: (data, response, error) in
guard let data = data, error == nil else print(error!); return
let decoder = JSONDecoder()
let classes = try! decoder.decode([Class].self, from: data)
for myClass in classes
print(myClass.first_name)
print(myClass.last_name)
print(myClass.email)
).resume()
override func viewDidAppear(_ animated: Bool)
super.viewDidAppear(animated)
tableview.reloadData()
override func didReceiveMemoryWarning()
super.didReceiveMemoryWarning()
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
//return myarray.count
return 1
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
let cell = tableView.dequeueReusableCell(withIdentifier: "groupCell", for: indexPath) as UITableViewCell
return cell
【问题讨论】:
【参考方案1】:几个问题
您的视图控制器缺少 dataSource,这是一个包含用户列表的数组 收到远程数据后更新数组(dataSource) 一旦数组(数据源)改变,重新加载
UITableView
,使用tableView.reloadData()
numberOfRowsInSection
内返回数组元素个数dataSource.count
UITableView.dequeueReusableCell(withIdentifier:for:)
要求您使用 tableview.register
方法注册单元类或 xib
最后,代替下划线,作为 first_name,使用 camelCase 变量命名约定,作为 firstName
struct User: Codable
let firstName: String
let lastName: String
let email: String
enum CodingKeys: String, CodingKey
case firstName = "first_name"
case lastName = "last_name"
case email = "email"
class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate
@IBOutlet weak var tableview: UITableView!
private var dataSource = [User]()
didSet
self.tableview.reloadData()
override func viewDidLoad()
super.viewDidLoad()
self.tableview.register(UITableViewCell.self, forCellReuseIdentifier: "groupCell")
self.tableview.dataSource = self
self.tableview.delegate = self
let url = URL(string: "https://example.com/users.php")
URLSession.shared.dataTask(with: url!, completionHandler: [weak self] (data, response, error) in
guard let data = data, error == nil else
print(error?.localizedDescription ?? "An error occurred")
return
// Within `dataTask` we are on background thread, we must update our UITableView on main thread
DispatchQueue.main.async
self?.dataSource = try! JSONDecoder().decode([User].self, from: data)
).resume()
override func viewDidAppear(_ animated: Bool)
super.viewDidAppear(animated)
tableview.reloadData()
func numberOfSections(in tableView: UITableView) -> Int
return 1
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
return dataSource.count
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
let cell = tableView.dequeueReusableCell(withIdentifier: "groupCell", for: indexPath)
let user = self.dataSource[indexPath.row]
cell.textLabel?.text = user.firstName
return cell
以上代码产生
【讨论】:
我只有一个错误:使用未解析的标识符“用户”@AamirR 从我上面的回答中复制struct User: Codable ...
,应该可以解决问题
好吧,谢谢,我应该看到了,对不起。当我启动应用程序时,它崩溃并出现错误:“线程 1:致命错误:在展开可选值时意外发现 nil”,其中代码为: override func viewDidAppear(_ animated: Bool) super.viewDidAppear(animated) tableview.reloadData() @AamirR
您好,感谢您的回答和帮助,现在可以使用了 :)。我在您的答案中编辑了我的网址,因此没有人可以看到它。只有一个问题,我尝试显示名字、姓氏和电子邮件但无法显示,请您帮帮我吗?【参考方案2】:
在 cellForRowAt 函数中你必须做这样的事情:
cell.textLabel?.text = myarray[indexPath.row]
因为 myarray 的文本应该显示在标签或其他位置
【讨论】:
"myarray" 我应该从我的代码那里写什么? @Dennis Feldbusch以上是关于在 UITableView 中显示来自 JSON 的数据的主要内容,如果未能解决你的问题,请参考以下文章
在 Swift 3 中将 Json 数据显示到 UITableView 中
在 Swift 2 和 Xcode 7 中使用来自 youtube 视频的 JSON 数据填充 UITableView
如何使用来自不同 ViewController 的 JSON 响应填充 UITableView?