iOS:tableView.reloadData()在swift中不起作用

我正在尝试在Swift中更新数据后重新加载我的表视图但它似乎不起作用。 当我更改选项卡并返回时,表视图会重新加载但不会自动重新加载。 这是我的代码:

override func viewDidLoad() { super.viewDidLoad() // some code refresh(self) } func refresh(sender: AnyObject) { // Reload the data self.tableView.reloadData() } 

我不明白为什么它在Objective-C中有效但在Swift中没有…我也尝试过:

 dispatch_async(dispatch_get_main_queue(), { () -> Void in self.tableView.reloadData() }) 

因为我在其他post中看到了这个,但它也不起作用。

谢谢你的帮助

编辑:我的整个视图控制器

 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. } */ } 

refresh函数中,您的加载使用闭包异步完成,但是您正在更新活动指示器并在闭包之外重新加载表,因此它将在加载完成之前执行。 您需要在闭包内移动此代码并确保它在主队列上执行(因为它更新了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 }) }) } 

如果您正在使用标签栏控制器(它听起来像你),并且在修改另一个标签中的内容后期望在表上刷新,则需要从目标视图控制器的viewWillAppear内部调用tableView.reloadData() ()或viewDidAppear()方法。 viewDidLoad()仅在该视图控制器的生命周期内调用一次。