2015-06-16 130 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

因此,發佈出現錯誤的代碼以及在違規行中引用的所有變量/結構體/聲明等。 –

相關問題