Как показать данные по идентификатору в TableView из JSON - PullRequest
1 голос
/ 02 апреля 2019

Я получаю данные из JSON, а также могу показать их в UITableView, но могу ли я показать данные, где id = 1, например?так же, как SQL?Спасибо за помощь заранее.Вот мой кодУ меня есть 2 TableViews, первый из них содержит 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
    }

}
}

Ответы [ 4 ]

1 голос
/ 02 апреля 2019

Вам не нужно 2-е UITableVIew, чтобы показать один User, это не правильная цель этого элемента управления пользовательского интерфейса, вместо этого вы можете сделать одно из следующих действий:

  • Показать 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)
            ])
        }
    
    }
    
0 голосов
/ 02 апреля 2019

Воспользуйтесь заголовком раздела.Таким образом, все заголовки разделов будут перечислять пользователей.В ячейке для строки для каждого раздела вы можете показать информацию для этого конкретного пользователя.Также вы можете управлять высотой строки для управления функцией show hide.

Дайте мне знать, если это поможет.

0 голосов
/ 02 апреля 2019

Если вам просто нужен конкретный пользователь, вы можете отфильтровать источник данных следующим образом:

dataSource.first(where: { $0.userid == "1" })
0 голосов
/ 02 апреля 2019

Вы можете сделать это с массивом фильтров перед перезагрузкой просмотра таблицы.

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
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...