2015-06-16 131 views
0

我刚刚开始学习Swift,并试图让Json数组在表格视图中显示。在加载UI之前执行代码

调试的几个小时后,我意识到,数据不是由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

当你从它很常见的,你没有当您第一次显示您的UI数据互联网上下载数据。

这很容易解决。首先让表格视图显示为空。然后在connectionDidFinishLoading方法的末尾拨打tableView.reloadData()。然后tableview会询问段和行的数目,并用刚刚完成加载的数据重新填充本身。

如果您想让用户知道他们需要等待数据下载,那么您可以在下载表格视图的顶部显示UIProgressIndicator。如果用户可以单击在没有数据时会崩溃的按钮,您可能还想禁用UI。

有时我会用包含进度指示器的50%不透明黑色视图覆盖整个视图控制器的内容视图。该视图可防止用户点击任何内容并同时调暗视图。然后,当缓慢的任务完成时,我只需隐藏半透明的黑色视图。

+0

因此,发布出现错误的代码以及在违规行中引用的所有变量/结构体/声明等。 –

相关问题