gpt4 book ai didi

ios - 很难重新加载 UITableView

转载 作者:行者123 更新时间:2023-11-29 01:06:01 24 4
gpt4 key购买 nike

我正在使用以下成功将一行加载到 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()
})

我已经确认,它成功调用了 reloadtable() 函数,它在其中运行 self.tableView.reloadData()。我卡住的地方是在那之后,tableView 实际上并没有重新加载。我可以这么说,因为我在 if let Activity = Activity(rawValue: indexPath.row) { 的行上放置了一个断点,并且该断点不会再次触发,尽管我可以确认这一点reloadtable() 函数确实被触发了。我在这里做错了什么,为什么不重新加载表格?谢谢!

编辑

这是 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
}


}

最佳答案

问题是 ActivityViewController().reloadtable() 调用。每次您的 Data 类下载数据时,这都会创建一个新的 ActivityViewController。重要的是,您只能在已存在(并显示在屏幕上)的同一个 ActivityViewController 实例上调用 reloadtable()

一个好的(基本但简单的)解决方案是进行以下重构:

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

这样,通过调用 check_demo_complete(),您将有义务传递一个闭包:

if (activity.title == "Demographics"){
Data().check_demo_complete() { [weak self] success in
if success {
// change your textColors etc
self?.tableView.reloadData()
}
}
}

同样,这是一个应该有效的基本解决方案。要吸取的重要教训是:不要在每次需要时都创建类的新实例。

关于ios - 很难重新加载 UITableView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36358451/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com