Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何从JSON在TableView中按ID显示数据_Php_Mysql_Swift_Xcode_Uitableview - Fatal编程技术网

Php 如何从JSON在TableView中按ID显示数据

Php 如何从JSON在TableView中按ID显示数据,php,mysql,swift,xcode,uitableview,Php,Mysql,Swift,Xcode,Uitableview,我从JSON获取数据,也可以在UITableView中显示它,但是我可以在id=1的位置显示数据吗?就像SQL一样?提前谢谢你的帮助。这是我的密码。我有两个TableView,第一个包含3个用户,第二个应该包含该用户信息,但当我单击一个用户时,它会显示所有用户的所有信息 import UIKit struct User: Codable { let firstName: String let lastName: String let email: String let userid: Stri

我从JSON获取数据,也可以在UITableView中显示它,但是我可以在id=1的位置显示数据吗?就像SQL一样?提前谢谢你的帮助。这是我的密码。我有两个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
    }

}
}

在重新加载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
    }

}

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

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

您不需要第二个
UITableVIew
来显示单个
用户
,这不是此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
    ,以获得一个符合您需要的UI,下面是一个基本示例

    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)
            ])
        }
    
    }
    

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


让我知道这是否有帮助。

您想按用户id按升序显示数据吗?不是按升序显示,例如,我从JSON获得10个用户,只想显示第三个用户(当然,所有数据在JSON中按id排序),请检查我的答案。MySQL标记与此有什么关系。。Java还有一个支持的类…这很好,谢谢,但是如果我有一个有3个用户的表视图,如果你点击一个用户,应用程序应该只显示该用户的信息呢?这是我的问题,很抱歉我不清楚。@AmedLMAB然后您可以使用UITableView didSelectRowAt委托方法检查来完成它。请更新回答当我单击其中一个时,它仍然显示来自所有用户的信息,可能是因为我有两个swift文件?此代码用于第一个Tableview,第二个Tableview相同,但我仅显示email@AmedLMAB亲爱的,对于多个Tableview或CollectionView,您只能在视图控制器中使用一个委托方法,因此您可以通过给定条件来使用它。请删除第二个委托方法,并使用如下条件处理它。请检查我的更新答案我更新了我的代码,当然它不起作用了…,所以希望你能帮助我我有两个TableView,第一个可以容纳3个用户,第二个应该包含该用户信息,但当我单击一个用户时,它会显示所有用户的所有信息。它很有效,感谢您为该项目提供的帮助,非常感谢。:)嗨,只有一个问题,如果我只想在第一个tableview中显示一个用户怎么办?感谢您的帮助:)@AamirRWithin
URLSession.shared.dataTask
您收到的JSON应该只有一个用户,在表视图中您只能看到该用户,可以这样做吗?如果不是这样,您需要用所需的逻辑进行解释。我的意思是我从JSON获得exp.“Amed,id=1”和“Robin,id=2”,但我只想在第一个表视图中显示“Amed”(第二个表视图中的数据与现在一样)