我开始使用swift 3.0来学习IOS开发。我构建了一个简单的app来调用web api来查询来自服务器数据库的数据。我可以获取json数据并将其解析为字符串数组。应用程序可以打印数组,但它无法在tableview中显示。它困惑了我几天,我在网上搜索了一些例子和答案,但仍然无法解决它。 我的代码如下:
class LocationTableViewController: UITableViewController {
var names: [String] = []
override func viewDidLoad() {
super.viewDidLoad()
//——————————————————————————get the data from web api and using json parsing————————————————————————
let config = URLSessionConfiguration.default // Session Configuration
let session = URLSession(configuration: config) // Load configuration into Session
let url = URL(string: "http://XXXXXXX/api/mylocations")!
let task = session.dataTask(with: url, completionHandler: {
(data, response, error) in
if error != nil {
print(error!.localizedDescription)
} else {
do {
var jsonResult: NSMutableArray = NSMutableArray()
let jsonArray = try JSONSerialization.jsonObject(with: data!, options:JSONSerialization.ReadingOptions.allowFragments) as! NSArray
jsonResult = jsonArray.mutableCopy() as! NSMutableArray
var jsonElement: NSDictionary = NSDictionary()
for i in 0..<jsonResult.count {
jsonElement = jsonResult[i] as! NSDictionary
if let name = jsonElement["Name"] as? String
{
// print(id)
// print(name)
// print(address)
// print(latitude)
// print(longitude)
// print("-------")
self.names.append(name)
}
// self.tableView.reloadData()
// print(self.names)
}
print(self.names)
// can print the string array data like [“name1”,”name2”,”name3”]
} catch {
print("error in JSONSerialization")
}
}
})
task.resume()
//-------------- ——— result is [] it seems the above code didn't put the string array to names.——————————————
print(self.names)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
override func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return names.count;
}
internal override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) ->
UITableViewCell {
let cellIdentifier = "cell"
let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier, for:
indexPath as IndexPath) as UITableViewCell
// Configure the cell...
cell.textLabel?.text = names[indexPath.row]
return cell
}
}
任何人都可以帮我看看吗?
答案 0 :(得分:1)
打印self.tableView.reloadData()
后放print(self.names)
。
答案 1 :(得分:0)
在您评论的位置......
结果是[]看来上面的代码没有把字符串数组放到 名称
在完成处理程序中下载数据之前 正在执行此代码行,因此我们不希望在此处看到任何内容。您会注意到 正在处理完成处理程序中的其他打印件。
完成处理程序末尾的tableView.reloadData()
应该正常工作。
您确定为tableView正确设置了委托吗?如果您注释掉下载任务,只需设置
,您会看到什么?names = ["Tom", "Dick", "Harry"]
在viewDidLoad
内?如果这不起作用,那么代表就会遇到问题。