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
}
}
'self.tableView.dataSource = kendinizin' olduğundan emin misiniz? – aimak
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" –
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