Мой массив объектов равен нулю, а мои данные верны - PullRequest
0 голосов
/ 01 декабря 2018

Я пытаюсь отобразить свои данные в табличном представлении, не используя фреймворк для анализа моих данных, но когда я добавляю свои данные в свою таблицу и отлаживаю их, на выходе получается ноль, в то время как мои данные, которые я получаю, хорошо анализируются,что-то забыли сделать?

Я использую структуру для своих параметров, как это:

    enum Types {
     case School
     case Hospital
     case Station_Essence
     case Restaurant
}

struct Adresse {
    public var title: String
    public var details: String?
    public var type: Types
    public var coordinate: [String: Any]
}

, и в моем ViewController я выполняю следующие действия:

    class ListMapViewController: UIViewController {

    @IBOutlet var TitleTableView: UITableView!
    @IBOutlet var MapView: MKMapView!

    var adresse: [Adresse]?

    override func viewDidLoad() {
        super.viewDidLoad()

        self.TitleTableView.register(UINib(nibName: "ListMapTableViewCell", bundle: nil), forCellReuseIdentifier: "Adresse")
        self.TitleTableView.delegate = self
        self.TitleTableView.dataSource = self
        guard let POI = URL(string: "https://moc4a-poi.herokuapp.com/") else {
            return
        }

        let task = URLSession.shared.dataTask(with: POI) { (data, response, error) in
            guard let dataResponse = data else { return }
            if let json = try! JSONSerialization.jsonObject(with: dataResponse, options:[]) as? [[String: Any]] {
                for data in json {
                    let title = data["title"] as! String
                    let details = data["details"] as? String
                    guard let type = data["type"] as? Int else { return }
                    let valueType = self.valueType(dataType: type)
                    guard let coordinates = data["coordinates"] as? [String: Any] else { return }
                    self.adresse?.append(Adresse(title: title, details: details, type: valueType, coordinate: coordinates))
                }
            }
            print(self.adresse)
        }
        self.TitleTableView.reloadData()
        task.resume()

    }

    private func valueType(dataType: Int) -> Types {
        if(dataType == 1) {
            return Types.School
        } else if (dataType == 2) {
            return Types.Hospital
        } else if (dataType == 3) {
            return Types.Station_Essence
        } else {
            return Types.Restaurant
        }
    }

}

extension ListMapViewController: UITableViewDataSource {
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return self.adresse?.count ?? 0
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "Adresse", for: indexPath) as! ListMapTableViewCell
        if let adresse = self.adresse?[indexPath.row] {
            cell.draw(adresse: adresse)
        }
        return cell
    }


}

extension ListMapViewController: UITableViewDelegate {

}

1 Ответ

0 голосов
/ 01 декабря 2018

У вас две большие проблемы.

  1. self.adresse - это nil.Вы никогда не назначаете это значение.Так что все self.adresse?... ничего не делают.
  2. Вы звоните reloadData слишком рано.Это необходимо сделать внутри блока завершения после обновления данных.И он должен находиться в главной очереди.

Чтобы исправить # 1, измените var adresse: [Adresse]? на var adresse = [Adresse]().Затем вы можете избавиться от всех ? после использования adresse.

. Чтобы исправить # 2, добавьте:

DispatchQueue.main.async {
    self.TitleTableView.reloadData()
}

сразу после print в концеблок завершения.Не забудьте удалить текущий вызов на reloadData.

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