我尝试在不使用任何框架解析数据的tableView中显示数据,但是当我将数据添加到表中并对其进行调试时,输出为零,而我检索到的数据得到很好的解析,是否忘记要做的事?
我将结构用作参数:
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 {
}
答案 0 :(得分:1)
您有两个大问题。
self.adresse
是nil
。您永远不会为其分配值。因此,所有self.adresse?...
均不执行任何操作。reloadData
。更新数据后,需要在完成块内完成此操作。而且它必须在主队列中。要修复#1,请将var adresse: [Adresse]?
更改为var adresse = [Adresse]()
。然后,您可以在使用?
之后清除所有adresse
。
要修复#2,请添加:
DispatchQueue.main.async {
self.TitleTableView.reloadData()
}
紧接在完成块末尾的print
之后。不要忘记删除当前对reloadData
的呼叫。