【问题标题】:UITableView cells updates just after restart of appUITableView 单元格在应用程序重新启动后更新
【发布时间】:2017-08-28 07:37:21
【问题描述】:

另一个 ViewController 中有一个按钮,如果我按下它,我应该会看到我按下按钮的时间。

按钮有效,但点击刷新按钮后表格不会刷新,将刷新放在 ViewDidAppear 函数上也不起作用。

我需要退出应用程序,从多任务处理中关闭它并再次打开它,然后我按下按钮的时间就会显示出来。我应该怎么做才能使刷新按钮起作用?

(两个视图控制器在同一个故事板中,第二个扩展了第一个)

第一个视图控制器:

class Tracking: UIViewController, UITableViewDelegate, UITableViewDataSource {
@IBOutlet weak var activity: UITableView!
var activities = [String]()
var userData = false

public func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return activities.count
}

public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = UITableViewCell(style: UITableViewCellStyle.default, reuseIdentifier: "cell")
    cell.textLabel?.text = activities[indexPath.row]
    return(cell)
}

@IBAction func Reload(_ sender: AnyObject) {
    activity.reloadData()
}
.
.
.
}

第二个视图控制器:

class Activity: Tracking {
    .
    .
    .
@IBAction func playButton(_ sender: AnyObject) {
    isPlayed += 1
    userData = true
    UserDefaults.standard.set(userData, forKey: "userData")
    let playElm = playStr + " בשעה: " + getTime()
    activities.append(playElm)
    UserDefaults.standard.set(activities, forKey: "activities")
}
    .
    .
    .
}

【问题讨论】:

  • "There's a button in another ViewController" 从您的代码中,该按钮似乎位于按钮的同一个 ViewController 上。你是如何做到这一点的?
  • @Larme 我已经更新了问题。
  • @matanm 您如何在 First View Controller 中从 Userdefaults 获取活动?
  • @ImadAli 喜欢这样:imgur.com/a/hxh9Q
  • @matanm 如果您进行调试,您是否看到viewDidLoad First VC 中保存的活动?

标签: ios swift


【解决方案1】:

您需要从用户默认的活动数组中获取您的新日期,然后您可以重新加载数据

@IBAction func Reload(_ sender: AnyObject) {
    self.activities = UserDefaults.standard.get( forKey: "activities")
    activity.reloadData()
}

【讨论】:

    【解决方案2】:

    当您调用 activity.reloadData() 时,您是在告诉表视图更新其行以及它们仅根据您使用该行定义的 activities 属性的内容来更新其行:

    var activities = [String]()
    

    当您从新开始加载应用程序时,activities 字符串数组尚未填充任何内容。我看到您将数据保存到 UserDefaults,但我没有看到您从中读取数据的任何地方。

    将下一个代码放入您的viewDidLoad()viewDidAppear() 不是您想要用于此目的的。

    activities = UserDefaults.standard.get(forKey: "activities")
    activity.reloadData()
    

    【讨论】:

      【解决方案3】:

      我设法在没有刷新按钮的情况下自动完成这项工作。当我将 Svetoslav Bramchev 编写的代码放在 viewDidAppear 中时,它就可以工作了。感谢您的帮助!

      override func viewDidLoad() {
          super.viewDidLoad()
          userData = UserDefaults.standard.bool(forKey: "userData")
          if(userData == true){
              activities = UserDefaults.standard.object(forKey: "activities") as! [String]
          } else {
              activities.append("no data")
              UserDefaults.standard.set(activities, forKey: "activities")
              if(activities[0] == "no data"){
                  activities.remove(at: 0)
                  UserDefaults.standard.set(activities, forKey: "activities")
              }
          }
      }
      
      override func viewDidAppear(_ animated: Bool) {
          activities = UserDefaults.standard.object(forKey: "activities") as! [String]
          activity.reloadData()
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-07-14
        • 2012-05-30
        • 1970-01-01
        • 2011-05-15
        • 1970-01-01
        • 2014-09-14
        • 1970-01-01
        相关资源
        最近更新 更多