2016-04-01 29 views
0

Yeniden yükleme zor bir zaman geçiriyorum UITableView'a bir satır başarıyla yüklenen aşağıdaki sınıfla çalışıyorum.UITableView

import UIKit 
import ResearchKit 

enum Activity: Int { 
    case Demographics 

    static var allValues: [Activity] { 
     var idx = 0 
     return Array(anyGenerator{ return self.init(rawValue: idx++)}) 
    } 

    var title: String { 
     switch self { 
     case .Demographics: 
      return "Demographics" 
     } 
    } 

    var subtitle: String { 
     switch self { 
      case .Demographics: 
       return "Demographics Survey" 
     } 
    } 
} 

class ActivityViewController: UITableViewController { 

    // MARK: UITableViewDataSource 

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     guard section == 0 else { return 0 } 

     return Activity.allValues.count 
    } 

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
     let cell = tableView.dequeueReusableCellWithIdentifier("activityCell", forIndexPath: indexPath) 

     if let activity = Activity(rawValue: indexPath.row) { 
      cell.textLabel?.text = activity.title 
      cell.detailTextLabel?.text = activity.subtitle 
      if (activity.title == "Demographics"){ 
       if (Data().is_demo_complete()){ 
        cell.textLabel?.textColor = UIColor.lightGrayColor() 
        cell.detailTextLabel?.textColor = UIColor.lightGrayColor() 
        cell.userInteractionEnabled = false 
       } 
      } 
     } 

     return cell 
    } 

    func reloadtable(){ 
     self.tableView.reloadData() 
    } 

    // MARK: UITableViewDelegate 

    override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 
     guard let activity = Activity(rawValue: indexPath.row) else { return } 

     let taskViewController: ORKTaskViewController 
     switch activity { 
      case .Demographics: 
       taskViewController = ORKTaskViewController(task: DemoTask, taskRunUUID: NSUUID()) 


     } 

     taskViewController.delegate = self 
     navigationController?.presentViewController(taskViewController, animated: true, completion: nil) 
    } 
} 

benim sunucuya tüm iletişim saklamak Data adlı başka sınıf var. Buradaki fikir şudur: sunucudaki bazı verileri kontrol etmem ve tablodaki satırlardan birini devre dışı bırakıp bırakmamayı bilmek zorundayım.

dispatch_async(dispatch_get_main_queue(), {() -> Void in 
    ActivityViewController().reloadtable() 
}) 

ben doğruladı, o başarıyla self.tableView.reloadData() çalıştığı içinde reloadtable() işlevini çağırır: Sunucu çağrı tamamlanmış ve başarılı olduğunda veri sınıfından itibaren, ben bunu. Sıkıştığım yer bundan sonra tabloyu yeniden yüklemiyor. Anlatabilirim çünkü if let activity = Activity(rawValue: indexPath.row) { yazan satırda bir kesme noktası koymuş ve reloadtable() işlevinin gerçekten tetiklendiğini doğrulayabilir olmamasına rağmen kesme noktası ikinci kez tetiklenmiyor. Burada neyi yanlış yapıyorum, neden tablo yeniden yüklenmiyor? Teşekkürler!

class Data: NSObject, NSURLSessionDelegate { 

    var unique_id = UIDevice.currentDevice().identifierForVendor!.UUIDString; 

    var demo_complete = false 

    func check_demo_complete(){ 

     let request = NSMutableURLRequest(URL: NSURL(string: "https://www.myurl.com/is_demo_complete.php")!) 
     request.HTTPMethod = "POST" 
     let postString = "unique_id=\(unique_id)&pass=somepass" 
     request.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding) 

     let configuration = NSURLSessionConfiguration.defaultSessionConfiguration() 
     let session = NSURLSession(configuration: configuration, delegate: self, delegateQueue: nil) 

     let task = session.dataTaskWithRequest(request) { 
      data, response, error in 

      if error != nil { 
       print("error=\(error)") 
       return 
      } 

      let responseString = NSString(data: data!, encoding: NSUTF8StringEncoding) 

      if (responseString == "true") { 
       self.demo_complete = true 
       print ("Demo has been completed") 
       dispatch_async(dispatch_get_main_queue(), {() -> Void in 
        ActivityViewController().reloadtable() 
       }) 
      } 
     } 
     task.resume() 
    } 

    func is_demo_complete() -> Bool{ 
     return self.demo_complete 
    } 


} 
+0

'self.tableView.dataSource = kendinizin' olduğundan emin misiniz? – aimak

+0

tablosunda görünen satırlar, aynı hızlı dosyada ancak sınıf tanımının dışında bir "enum" olarak tanımlanır. Ne demek istediğine emin değilim. Ancak "cellForRowAtIndexPath" –

+0

içinde bir filtreye sahip olduğumu görebilirsiniz. "UITableView" reloadData() işlevi çağrıldığında, "UITableViewDataSource" öğesinden bilgi çağıracaktır. Kodunuzdan 'ActivityViewController', self.tableView'ün dataSource olmalıdır. – aimak

cevap

1

sorun ActivityViewController().reloadtable() çağrısıdır:

DÜZENLEME İşte

Data sınıftır. Bu, sınıf indirilen verilerinize her yeni bir ActivityViewController oluşturur. Zaten reloadtable() numaralı telefonu zaten var olan ActivityViewController örneğinde çağırmanız önemlidir (ve ekranda görüntülenen).

çözüm aşağıdaki üstlenmeden yapmak olacaktır Bir iyi (temel ama basit):

if (activity.title == "Demographics"){ 
    Data().check_demo_complete() { [weak self] success in 
    if success { 
     // change your textColors etc 
     self?.tableView.reloadData() 
    } 
    } 
} 
: Eğer bir kapatma geçmek zorunda olurdum check_demo_complete() arayarak,

func check_demo_complete(completion:(Bool ->()){ 
    // your network call 
    dispatch_async(dispatch_get_main_queue()) { 
    if (responseString == "true") { 
     completion(true) 
    } 
    else { 
     completion(false) 
    } 
    // or, simpler : completion(responseString == "true") 
    } 
} 

Bu şekilde

Yine, bu çalışması gereken temel bir çözüm. Öğrenilmesi gereken önemli ders: her ihtiyaç duyduğunuzda yeni sınıf örneği oluşturmamanız.

+0

Kutsal Sh * t çalıştı. Çok teşekkür ederim! Şimdi sadece sunucu çağrısının tekrar tekrar yapıldığını görüyorum, gerçekten sadece bir kez yapılmasına ihtiyacım var, ama muhtemelen buradan çözemiyorum. Bana gerçekten bir teknik verdiniz, bu gerçekten yararlı! –

+1

Bunun nedeni, 'cellForRow' biçiminde, yani her hücre görüntülendiğinde yapılan istektir. – aimak

+0

Evet ve sonra bu işlevin içindeki verileri yeniden yüklemeyi denedim ... Tabloyu 'cellForRow' dışından yeniden yüklemek mümkün mü? –