在 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?

在 UITableView 中显示 JSON 数据

在 iOS 上将 Wordpress JSON 解析为 UITableView

用来自 JSON Request iOS 的字典填充 UITableView