iOS:tableView.reloadData()在swift中不起作用 [英] iOS: tableView.reloadData() doesn't work in swift
问题描述
我正在尝试在Swift中更新数据后重新加载我的表视图,但它似乎不起作用。当我更改选项卡并返回时,表视图会重新加载但不会自动重新加载。
这是我的代码:
I'm trying to reload my table view after updating data in Swift but it doesn't seems to work. When I change tab and go back the table view is reloaded but not automatically. Here is my code:
override func viewDidLoad() {
super.viewDidLoad()
// some code
refresh(self)
}
func refresh(sender: AnyObject) {
// Reload the data
self.tableView.reloadData()
}
我不明白为什么它在Objective-C中工作但在Swift中不起作用...
我也尝试过:
I don't understand why it works in Objective-C but not in Swift... I also tried to put :
dispatch_async(dispatch_get_main_queue(), { () -> Void in
self.tableView.reloadData()
})
因为我在其他帖子中看到了这个但它也不起作用。
because I saw this in other post but it doesn't work either.
感谢您的帮助
编辑:我的整个视图控制器
My whole View Controller
class HighwaysViewController: UITableViewController {
var highways: [Highway]!
override func viewDidLoad() {
super.viewDidLoad()
// Uncomment the following line to preserve selection between presentations
// self.clearsSelectionOnViewWillAppear = false
// Uncomment the following line to display an Edit button in the navigation bar for this view controller.
// self.navigationItem.rightBarButtonItem = self.editButtonItem()
highways = [Highway]()
// On ajoute le "Pull to refresh"
refreshControl = UIRefreshControl()
refreshControl!.addTarget(self, action: Selector("refresh:"), forControlEvents: UIControlEvents.ValueChanged)
tableView.addSubview(refreshControl!)
refresh(self)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
func refresh(sender: AnyObject) {
// Afficher l'icône de chargement dans la barre de status
UIApplication.sharedApplication().networkActivityIndicatorVisible = true
// On télécharge les autoroutes
var url = NSURL(string: "http://theurl.com")! // URL du JSON
var request = NSURLRequest(URL: url) // Création de la requête HTTP
var queue = NSOperationQueue() // Création de NSOperationQueue à laquelle le bloc du gestionnaire est distribué lorsque la demande complète ou échoué
// Envoi de la requête asynchrone en utilisant NSURLConnection
NSURLConnection.sendAsynchronousRequest(request, queue: queue, completionHandler:{(response: NSURLResponse!, data: NSData!, error: NSError!) ->Void in
// Gestion des erreurs de connexion
if error != nil {
// Masquer l'icône de chargement dans la barre de status
UIApplication.sharedApplication().networkActivityIndicatorVisible = false
println(error.localizedDescription)
let errorAlert = UIAlertView(title: "Erreur", message: error.localizedDescription, delegate: self, cancelButtonTitle: "OK")
errorAlert.show()
}
else {
// Récupération du JSON et gestion des erreurs
let json = JSON(data: data)
if let highwaysData = json.arrayValue {
for highway in highwaysData {
var newHighway = Highway(ids: highway["Ids"].stringValue, name: highway["Name"].stringValue, label: highway["Direction"].stringValue, length: highway["Length"].stringValue, directions: highway["Direction"].stringValue, operateur: highway["Operator"].stringValue)
self.highways.append(newHighway)
}
}
}
})
if (self.refreshControl!.refreshing) {
self.refreshControl!.endRefreshing()
}
tableView.reloadData() // Here is the problem
// Masquer l'icône de chargement dans la barre de status
UIApplication.sharedApplication().networkActivityIndicatorVisible = false
}
// MARK: - Table view data source
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
// Return the number of rows in the section.
return highways.count
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("highwayCell", forIndexPath: indexPath) as UITableViewCell
// Configure the cell...
let tableCell = highways[indexPath.row]
let nameLabel = cell.viewWithTag(1) as UILabel
let directionLabel = cell.viewWithTag(2) as UILabel
nameLabel.text = tableCell.name!
directionLabel.text = tableCell.getDirections()
return cell
}
/*
// MARK: - Navigation
// In a storyboard-based application, you will often want to do a little preparation before navigation
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
// Get the new view controller using [segue destinationViewController].
// Pass the selected object to the new view controller.
}
*/
}
推荐答案
在刷新
函数中,您的加载使用闭包异步完成,但是您正在更新活动指示符并在闭包之外重新加载表,因此它将在加载完成之前执行。您需要在闭包内移动此代码并确保它在主队列上执行(因为它更新UI)
In your refresh
function, your load completes asynchronously using a closure, but you are updating your activity indicator and reloading your table outside of the closure, so it will execute before the load is completed. You need to move this code inside the closure and ensure that it executes on the main queue (as it updates the UI)
func refresh(sender: AnyObject) {
// Afficher l'icône de chargement dans la barre de status
UIApplication.sharedApplication().networkActivityIndicatorVisible = true
// On télécharge les autoroutes
var url = NSURL(string: "http://theurl.com")! // URL du JSON
var request = NSURLRequest(URL: url) // Création de la requête HTTP
var queue = NSOperationQueue() // Création de NSOperationQueue à laquelle le bloc du gestionnaire est distribué lorsque la demande complète ou échoué
// Envoi de la requête asynchrone en utilisant NSURLConnection
NSURLConnection.sendAsynchronousRequest(request, queue: queue, completionHandler:{(response: NSURLResponse!, data: NSData!, error: NSError!) ->Void in
// Gestion des erreurs de connexion
if error != nil {
// Masquer l'icône de chargement dans la barre de status
UIApplication.sharedApplication().networkActivityIndicatorVisible = false
println(error.localizedDescription)
let errorAlert = UIAlertView(title: "Erreur", message: error.localizedDescription, delegate: self, cancelButtonTitle: "OK")
errorAlert.show()
}
else {
// Récupération du JSON et gestion des erreurs
let json = JSON(data: data)
if let highwaysData = json.arrayValue {
for highway in highwaysData {
var newHighway = Highway(ids: highway["Ids"].stringValue, name: highway["Name"].stringValue, label: highway["Direction"].stringValue, length: highway["Length"].stringValue, directions: highway["Direction"].stringValue, operateur: highway["Operator"].stringValue)
self.highways.append(newHighway)
}
}
}
dispatch_async(dispatch_get_main_queue(), {
if (self.refreshControl!.refreshing) {
self.refreshControl!.endRefreshing()
}
self.tableView.reloadData()
// Masquer l'icône de chargement dans la barre de status
UIApplication.sharedApplication().networkActivityIndicatorVisible = false
})
})
}
这篇关于iOS:tableView.reloadData()在swift中不起作用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!