【问题标题】:How to show data by ID in TableView from JSON如何在 JSON 的 TableView 中按 ID 显示数据
【发布时间】:2019-04-02 12:02:56
【问题描述】:

我从 JSON 获取数据,也可以在 UITableView 中显示,但我可以显示 id = 1 的数据吗?就像 SQL 一样?提前感谢您的帮助。这是我的代码。我有 2 个 TableView,第一个拥有 3 个用户,第二个应该有该用户信息,但是当我点击一个用户时,它会显示所有用户的所有信息。

import UIKit

struct User: Codable {
let firstName: String
let lastName: String
let email: String
let userid: String

enum CodingKeys: String, CodingKey {
    case firstName = "first_name"
    case lastName = "last_name"
    case email = "email"
    case userid = "user_id"
}
}

class tableViewCellLabels: UITableViewCell {

@IBOutlet var lbl_firstName: UILabel!
@IBOutlet var lbl_lastName: UILabel!
@IBOutlet var lbl_email: UILabel!
@IBOutlet var lbl_userid: UILabel!

}

class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {

@IBOutlet weak var tableview1: UITableView!
@IBOutlet var tableview2: UITableView!
private var dataSource = [User]() {
    didSet {
        self.tableview1.reloadData()
    }
}


override func viewDidLoad() {
    super.viewDidLoad()

    self.tableview1.dataSource = self
    self.tableview1.delegate = self

    let url = URL(string: "https://test.netperformers.de/users")

    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
        }

        DispatchQueue.main.async {
            self?.dataSource = try! JSONDecoder().decode([User].self, from: data)
        }
    }).resume()
}

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    tableview1.reloadData()
}

func numberOfSections(in tableView: UITableView) -> Int {
    return 1
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return dataSource.count
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    if tableView == tableView{
        print(dataSource[indexPath.row]) // your clicked user data
    }else{
        // Second Tableview Click Event here
    }

}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "groupCell", for: indexPath) as! tableViewCellLabels
    let user = self.dataSource[indexPath.row]

    cell.lbl_firstName.text = user.firstName
    cell.lbl_lastName.text = user.lastName
    cell.lbl_userid.text = user.userid
    return cell
}
func tableView1(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    if tableView == tableView{
        print(dataSource[indexPath.row]) // your clicked user data
    }else{
        // Second Tableview Click Event here
    }

}
}

【问题讨论】:

  • 你想按user_id升序显示数据吗?
  • 不按升序排列,例如我从 JSON 中得到 10 个用户,只想显示第三个(当然所有数据在 JSON 中都按 ID 排序)
  • 请检查我的答案。
  • MySQL 标签与此有什么关系。Java 也有一个支持jsonpathJSONObject 类...

标签: php mysql swift xcode uitableview


【解决方案1】:

您不需要第二个UITableVIew 来显示单个User,这不是此 ui 控件的正确用途,您可以执行以下操作之一:

  • 用用户信息显示UIAlertController

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        let user = self.dataSource[indexPath.row]
    
        let alertController = UIAlertController(title: user.firstName + " " + user.lastName, message: user.email, preferredStyle: .alert)
        let action = UIAlertAction(title: "OK", style: .default)
        alertController.addAction(action)
        self.present(alertController, animated: true, completion: nil)
    }
    
  • 创建一个UIViewController 以获得符合您需求的用户界面,以下是一个基本示例

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        let user = self.dataSource[indexPath.row]
        let userVC = UserViewController(user: user)
        self.navigationController?.pushViewController(userVC, animated: true)
    }
    
    class UserViewController: UIViewController {
    
        private let user: User
    
        init(user: User) {
            self.user = user
            super.init(nibName: nil, bundle: nil)
        }
    
        required init?(coder aDecoder: NSCoder) {
            fatalError("init(coder:) has not been implemented")
        }
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            self.view.backgroundColor = .white
    
            let nameLabel = UILabel()
            nameLabel.text = self.user.firstName + " " + self.user.lastName
            nameLabel.translatesAutoresizingMaskIntoConstraints = false
            self.view.addSubview(nameLabel)
    
            let emailLabel = UILabel()
            emailLabel.text = self.user.email
            emailLabel.translatesAutoresizingMaskIntoConstraints = false
            self.view.addSubview(emailLabel)
    
            let safeAreaGuide = self.view.safeAreaLayoutGuide
            NSLayoutConstraint.activate([
                nameLabel.topAnchor.constraint(equalTo: safeAreaGuide.topAnchor, constant: 16.0),
                nameLabel.leadingAnchor.constraint(equalTo: safeAreaGuide.leadingAnchor, constant: 16.0),
                nameLabel.trailingAnchor.constraint(equalTo: safeAreaGuide.trailingAnchor, constant: 16.0),
    
                emailLabel.topAnchor.constraint(equalTo: nameLabel.bottomAnchor, constant: 8.0),
                emailLabel.leadingAnchor.constraint(equalTo: safeAreaGuide.leadingAnchor, constant: 16.0),
                emailLabel.trailingAnchor.constraint(equalTo: safeAreaGuide.trailingAnchor, constant: 16.0)
            ])
        }
    
    }
    

【讨论】:

  • 它有效,感谢您的项目,您帮助了我很多,非常感谢。 :)
  • 嗨,只有一个问题,如果我只想在第一个表格视图中显示一个用户怎么办?感谢您的帮助:) @AamirR
  • URLSession.shared.dataTask 中,您收到的 JSON 应该只有一个用户,而在表格视图中您只会看到该用户,可以吗?如果不是,您需要用所需的逻辑进行解释。
  • 我的意思是我得到了 exp。 JSON中的“Amed,id = 1”和“Robin,id = 2”,但我只想在第一个tableView中显示“Amed”(第二个中的数据就像现在一样)
【解决方案2】:

如果你只需要一个特定的用户,你可以像这样过滤数据源:

dataSource.first(where: { $0.userid == "1" })

【讨论】:

  • 我有 2 个 TableView,第一个拥有 3 个用户,第二个应该有该用户信息,但是当我点击一个用户时,它会显示所有用户的所有信息。
【解决方案3】:

利用部分标题。因此,所有部分标题都会列出用户。在每个部分的行单元格中,您可以显示该特定用户的信息。您还可以管理显示隐藏功能的行高。

如果这有帮助,请告诉我。

【讨论】:

    【解决方案4】:

    您可以在重新加载 tableview 之前使用过滤器数组。

    private var dataSource = [User]() {
        didSet {
            dataSource = dataSource.filter({ (item) -> Bool in
                return item.userid == "3" // put your filter query here
            })
            self.tableview.reloadData()
        }
    }
    

    点击事件

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        if tableView == YourFirstTable {
            print(dataSource[indexPath.row]) // your clicked user data
        } else {
            // Second Tableview Click Event here
        }
    
    }
    

    【讨论】:

    • 非常感谢,但是如果我有一个包含 3 个用户的表视图,并且如果您单击一个用户,应用程序应该只显示来自该用户的信息?这是我的问题,抱歉我不清楚。
    • @AmedLMAB 然后你可以用 UITableView didSelectRowAt 委托方法检查请更新答案
    • 当我点击一个时,它仍然显示来自所有用户的信息,可能是因为我有 2 个 swift 文件?此代码适用于第一个 Tableview 和第二个 tableView 相同,但我只显示电子邮件
    • @AmedLMAB 亲爱的,您只能在视图控制器中为多个 Tableview 或 CollectionView 使用单个委托方法,因此您可以通过给出条件来使用它,请删除第二个委托方法并使用类似的条件处理它这个。 请检查我的更新答案
    • 我更新了我的代码,当然它不起作用.....,所以希望你能帮助我。 :)
    猜你喜欢
    • 2020-03-28
    • 2021-07-13
    • 2021-11-05
    • 1970-01-01
    • 2022-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-06
    相关资源
    最近更新 更多