私はUITableViewにローを正常にロードする次のクラスで作業しています。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)
}
}
Data
という別のクラスでは、すべての通信を自分のサーバーに保存しています。考え方は、サーバー上のいくつかのデータをチェックして、グレーアウトするか、tableViewの行のいずれかを無効にするかどうかを判断する必要があるということです。データクラス、サーバーの呼び出しが完了し、成功したとき、私はこれを行うから:
dispatch_async(dispatch_get_main_queue(), {() -> Void in
ActivityViewController().reloadtable()
})
私は正常にそれがself.tableView.reloadData()
を実行するreloadtable()
機能を呼び出すことを、確認しています。私が立ち往生している場所は、その後、tableViewは実際にリロードされません。私はif let activity = Activity(rawValue: indexPath.row) {
という行にブレークポイントを設定し、reloadtable()
関数が実際にトリガーされたことを確認できたとしても、ブレークポイントが2度目にトリガーされないため、わかります。私はここで間違って何をしています、なぜテーブルが再ロードされていませんか?ありがとう!ここで
EDIT
はData
クラスです:
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 = self'は本当ですか? – aimak
テーブルに現れる行は、同じswiftファイルの 'enum'で定義されていますが、クラス定義の外にあります。あなたが何を意味するかわからない。しかし、 'cellForRowAtIndexPath'の中にフィルタがあることが分かります。 –
' UITableView'' reloadData()が呼び出されると、 'UITableViewDataSource'から情報を呼び出します。あなたのコードから、 'ActivityViewController'は' self.tableView'のdataSourceでなければなりません。 – aimak