2014-11-26 22 views
6

Swift'deki verileri güncelleştirdikten sonra tablo görünümünü yeniden yüklemeyi deniyorum ama işe yaramıyor gibi görünüyor. Sekmeyi değiştirip geri gittiğimde tablo görünümü yeniden yüklenir, ancak otomatik olarak değil. Bunu görene çünküiOS: tableView.reloadData() hızlı çalışmaz

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

: Bu Objective-C çalışır ancak Swift ... ben de koymak için çalıştı neden anlamıyorum

override func viewDidLoad() { 
    super.viewDidLoad() 

    // some code 

    refresh(self) 
} 

func refresh(sender: AnyObject) { 
    // Reload the data 

    self.tableView.reloadData() 
} 

: İşte benim kodudur diğer yazılarda da işe yaramıyor.

EDIT yardımcı olmak için

Teşekkür: Benim bütün View Controller sizin refresh fonksiyonunda

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

Sadece 'viewDidLoad'dan' refresh() 'diyor musunuz? Sadece bir kez kontrolörlerin yaşam döngüsü başına bir kez yürütülen bir not alın. – Kirsteins

+0

ViewDidLoad dışında reloadData'yi nerede arıyorsunuz? – Paulw11

+1

Ayrıca, –

cevap

12

, senin yük uyumsuz bir kapak yardımıyla tamamladığında, ancak etkinlik göstergesini güncelliyoruz ve dışında tablonuzu yeniden Kapatma, bu yüzden yük tamamlanmadan önce yürütülür. Sen kapatılması içine bu kodu taşımak ve ana sıraya yürütür sağlamak gerekir Eğer (sen gibi geliyor) bir sekme çubuğu denetleyicisi kullanıyorsanız,

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

Çok teşekkür ederim, mükemmel çalışıyor ve şimdi anlıyorum benim hatamdan daha iyi! :) –

+1

PS: '' self': 'self.tableView.reloadData()' –

+0

ile cevabı değiştirmem gerekiyor. Kodunu kopyaladım, o yüzden özledim. Şahsen her zaman kafa karışıklığı önlemek için “ben” i kullanırım, ayrıca Obj C'den her zaman gerekli olan bir alışkanlıktır. – Paulw11

1

(o UI günceller gibi) ve Başka bir sekmede bir şey değiştirdikten sonra masadaki yenilemeyi beklerseniz, bunun yerine, hedef görünüm denetleyicisinin viewWillAppear() veya viewDidAppear() yönteminin içinden tableView.reloadData() yöntemini çağırmanız gerekir. viewDidLoad(), bu görünüm denetleyicisinin ömrü için yalnızca bir kez çağrılır.

+0

Hayır, aynı sekmede bir yenileme bekliyorum. Sadece tablo görünümündeki verileri yükledikten sonra yenilenmesini istiyorum, ancak çalışmaz –

+0

Görüntü denetleyici kodunun daha fazlasını görmeniz gerekiyor. "Veri yükleme" birçok farklı şekilde yapılabilir. – RiverbayChris

+0

Gönderiyi düzenledim –

İlgili konular