我刚刚开始学习Swift,我试图让Json数组显示在表视图中。
经过几个小时的调试后,我意识到当UI出现时,数据还没有准备好,因为我得到numberOfRowsInSection = 0
我想知道在从网址中提取Json数据后是否有办法加载表格。
提前感谢您的回答。
class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, NSURLConnectionDelegate {
@IBOutlet var tableView: UITableView!
lazy var data = NSMutableData()
var datatodisplay = [String]()
override func viewDidLoad() {
super.viewDidLoad()
}
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
startConnection()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
println(datatodisplay.count)
return datatodisplay.count
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
var cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! UITableViewCell
cell.textLabel?.text = datatodisplay[indexPath.row]
return cell
}
func startConnection(){
//start connection to the the fixer.io API
let urlPath: String = "http://api.fixer.io/latest"
var url: NSURL = NSURL(string: urlPath)!
var request: NSURLRequest = NSURLRequest(URL: url)
var connection: NSURLConnection = NSURLConnection(request: request, delegate: self, startImmediately: false)!
connection.start()
}
func connection(connection: NSURLConnection!, didReceiveData data: NSData!){
self.data.appendData(data)
}
func connectionDidFinishLoading(connection: NSURLConnection!) {
var err: NSError
var jsonResult: NSDictionary = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: nil) as! NSDictionary
var rawdata = jsonResult
println(rawdata)
dezarray(rawdata)
}
func dezarray(rawdata: NSDictionary){
if let rawrates = rawdata["rates"] as? NSDictionary {
println(rawrates)
println((rawrates.count))
println(rawrates["USD"])
for (currency, rawrate) in rawrates {
println("\(currency): \(rawrate)")
datatodisplay.append("\(currency): \(rawrate)")
}
println(datatodisplay)
}
}
}
答案 0 :(得分:0)
当您从互联网上下载数据时,在首次显示用户界面时,您没有数据,这很常见。
这很容易解决。首先让表格视图显示为空。然后,只需在tableView.reloadData()
方法结束时致电connectionDidFinishLoading
即可。然后tableview将询问部分和行的数量,并使用刚刚完成加载的数据重新填充。
如果您想让用户知道他们需要等待数据下载,您可以在下载表格视图时显示UIProgressIndicator。如果用户可以单击在没有数据时崩溃的按钮,您可能还想要禁用UI。
有时,我会使用包含进度指示器的50%不透明黑色视图覆盖整个视图控制器的内容视图。该视图可防止用户同时点击任何内容并使视图变暗。然后当慢速任务完成时,我只是隐藏半透明的黑色视图。