Показывать данные из JSON в UITableView

#mysql #json #swift #xcode #uitableview

#mysql #json #swift #xcode #uitableview

Вопрос:

……………………………………………………………………………………………………………………………………………….. Я получаю данные и печатаю их. Возможно, код неверен, я просто новичок в 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, массив, содержащий список пользователей
  • Обновите массив (источник данных) после получения удаленных данных
  • Перезагрузите UITableView после изменения массива (источника данных), используя tableView.reloadData()
  • Внутри numberOfRowsInSection возвращает количество элементов массива dataSource.count
  • UITableView.dequeueReusableCell(withIdentifier:for:) требуется, чтобы вы зарегистрировали класс ячейки или xib с помощью tableview.register метода
  • Наконец, вместо подчеркивания в качестве 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
    }

}
  

Приведенный выше код дает

введите описание изображения здесь

Комментарии:

1. У меня есть только одна ошибка, которая заключается в следующем: использование неразрешенного идентификатора ‘User’ @AamirR

2. Скопируйте struct User: Codable { ... } из моего ответа выше, должно решить проблему

3. Ну, спасибо, что сработало, я должен был это увидеть, извините. Когда я запускаю приложение, оно выходит из строя, и я получаю сообщение об ошибке: «Поток 1: Неустранимая ошибка: неожиданно обнаружено нуль при развертывании необязательного значения», где код: переопределить функцию viewDidAppear(_ animated: Bool) { super.viewDidAppear (animated) tableview.reloadData() } @AamirR

4. Привет, спасибо за ваш ответ и помощь, теперь это работает :). Я отредактировал свой URL в вашем ответе, чтобы никто не смог его увидеть. Только один вопрос, я пытался показать имя, фамилию и адрес электронной почты, но не смог, вы можете мне помочь, пожалуйста?

Ответ №2:

В функции cellForRowAt вы должны сделать что-то подобное :

 cell.textLabel?.text = myarray[indexPath.row]
  

потому что текст myarray должен отображаться на ярлыке или что-то еще

Комментарии:

1. «myarray» что я должен написать там из своего кода? @Деннис Фелдбуш