- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用以下成功将一行加载到 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/
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 9 年前。 Improve th
我有一个带有输入字段的表单,使用javascript,当用户输入超过2个字符时,它会在第一个输入字段下方创建相同的输入字段。其代码是: Optie 1: 1 && treated[this.na
这是我的: char userInput; int position; vector userVector(7); vector someVector(7,1); cin >> userInput;
尝试使用 typescript 和 redux 构建一个简单的 react crud 应用程序并遇到以下问题。我有一个具有指定签名的函数,它将一个人对象作为参数,如此处所示。 export defau
哦,我多么希望 TCP 像 UDP 一样基于数据包! [查看评论] 但是,唉,事实并非如此,所以我正在尝试实现我自己的数据包层。这是到目前为止的事件链(忽略写入数据包) 哦,我的数据包结构非常简单:两
我想在我的页面底部放置一个包含不同数量图片的栏,这些图片(如果比页面宽)可以左右滚动。 页面宽度在变化,我希望 Pane 的宽度为 100%。 我试图通过让中间的 div 溢出并使用 jquery.a
我曾尝试在工作时将我的 Rails 应用程序 bundle 到我的 Mac 上。在家里它运行良好,我之前已经设法自己解决了它,但这次无论我尝试什么似乎都无法解决它。 我在运行 bundle/bundl
所以我有一个旧的网络表单站点,并且正在努力使其更易于维护。把它扔掉并重写它不是一种选择。 IoC 显然是它首先得到的东西之一,但这给我留下了服务定位器模式和糟糕的品味,并且想知道它是否可以做得更好。
我是一名优秀的程序员,十分优秀!