Почему в моем табличном представлении ничего не отображается? - PullRequest
0 голосов
/ 06 мая 2020

В настоящее время я попытался настроить json api, чтобы возвращать все имена пользователей последователей пользователя. У меня проблема, когда я пытаюсь добавить точку останова в начале функции tableview (и очереди отправки), они не работают, и я понятия не имею, почему. Все остальные мои точки останова работают. В любом случае, что я хочу здесь sh, так это вернуть имя пользователя последователя каждого пользователя в другую ячейку. Я пробовал разные решения из inte rnet, но ни одно из них не сработало. Я попытался протестировать приведенный ниже код, и все ячейки были пустыми. Вот часть моего кода для тех, кто мог бы понять, что в tarnation я делаю неправильно.

контроллер представления

import UIKit

class FollowerListViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return followers.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        parseFollowers() // Second breakpoint
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath as IndexPath)
        tableView.dataSource = self;
        let follower = followers[indexPath.row]
        cell.textLabel!.text = follower.username
        DispatchQueue.main.async {
            self.tableView.reloadData()
        }
        return cell

    }


    override func viewDidLoad() {
        super.viewDidLoad()
        parseFollowers()
    }
    struct Root: Codable {
        let followers : FollowerData
    }
    struct FollowerData: Codable {
        enum CodingKeys: String, CodingKey {
            case username = "username"
        }
        let username : String
    }
    @IBOutlet weak var tableView: UITableView!
    var followers = [FollowerData]()
    func parseFollowers() {
        let decoder = JSONDecoder()
        do {
            let url =  URL(string: "http://localhost:3000/api/v1/profiles/1.json")
            let jsonData = NSData(contentsOf: url!)
            let output = try decoder.decode(Root.self, from: jsonData! as Data)
        } catch {
            print(error.localizedDescription)
            showNoResponseFromServer()
            return
        }
        DispatchQueue.main.async {  // Second breakpoint
            self.tableView.reloadData()
        }
    }
    func showNoResponseFromServer() {

        let alert = UIAlertController(title: "Error", message: "No response from server. Try again later.", preferredStyle: UIAlertController.Style.alert)

        alert.addAction(UIAlertAction(title: "OK", style: UIAlertAction.Style.default, handler: nil))

        self.present(alert, animated: true, completion: nil)
    }

json ответ с сервера

{
    "username": "test1",
    "followers": [
        {
            "username": "test2"
        }
    ]
}

1 Ответ

1 голос
/ 06 мая 2020

Переместите эту строку

tableView.dataSource = self

в viewDidLoad и измените массив источников данных

let output = try decoder.decode(Root.self, from: jsonData! as Data)
self.followers = output.followers

и не используйте let jsonData = NSData(contentsOf: url!), поскольку он блокирует использование основного потока Alamofire или URLsession

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