2014-11-26 2 views
6

Я пытаюсь перезагрузить мой просмотр таблицы после обновления данных в Swift, но это, похоже, не работает. Когда я меняю вкладку и возвращаюсь, представление таблицы перезагружается, но не автоматически. Вот мой код:iOS: tableView.reloadData() не работает в 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() 
}) 

, потому что я видел это в другой должности, но это тоже не работает.

Спасибо за помощь

EDIT: Весь моим Посмотреть контроллер

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

} 
+2

Вы вызываете 'refresh()' только из 'viewDidLoad'? Обратите внимание, что он выполняется только один раз для жизненного цикла контроллеров. – Kirsteins

+0

Где вы вызываете reloadData в стороне от viewDidLoad? – Paulw11

+1

Кроме того, нет необходимости передавать ссылку на себя внутри метода обновления –

ответ

12

В вашей refresh функции, ваша нагрузка выполняется асинхронно с помощью закрытия, но вы обновляете свой индикатор активности и перегрузочная таблицу вне закрытие, поэтому оно будет выполняться до завершения загрузки. Вы должны переместить этот код внутри затвора и убедитесь, что он выполняет на главную очереди (как он обновляет интерфейс)

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 
      }) 

     }) 

    } 
+0

Спасибо, он отлично работает, и теперь я понимаю лучше моя ошибка! :) –

+1

PS: в закрытии мы должны вызвать переменную с 'self':' self.tableView.reloadData() ' –

+0

Я обновил свой ответ. Я просто скопировал ваш код, поэтому я пропустил это. Лично я всегда использую 'self', чтобы избежать путаницы, также это привычка от Obj C, где это всегда требуется. – Paulw11

1

Если вы используете контроллер панели вкладок (что это звучит, как вы), и ожидают обновления в таблице после изменения чего-либо на другой вкладке, вам нужно будет вызвать tableView.reloadData() изнутри метода view viewWillAppear() или контроллера viewDidAppear(). viewDidLoad() вызывается только один раз для жизни этого контроллера представления.

+0

Нет, я ожидаю обновления на той же вкладке. Я просто хочу, чтобы мой просмотр таблицы обновлялся после загрузки данных, но он не работает. –

+0

Необходимо увидеть больше кода контроллера вида. «Загрузка данных» может быть выполнена разными способами. – RiverbayChris

+0

Я отредактировал мой пост –

Смежные вопросы