【问题标题】:Swift: How to reload new content (eg. array) every time the tableview appears?Swift:每次出现 tableview 时如何重新加载新内容(例如数组)?
【发布时间】:2018-10-08 04:35:25
【问题描述】:

我有一个带有两个视图的标签栏:

  • 表格视图
  • 视图控制器添加数据

然后我有一个数组,它将使用新内容从视图控制器更新(例如,只需附加新字符串)。

这个数组填充表格视图。 现在,当应用程序启动时,表格视图显示所有数组内容,但是当我通过选项卡栏移动到视图控制器时,将内容添加到数组并通过选项卡栏移回表格视图,我无法更新表格视图以便它从数组中提取新内容。

我尝试在viewDidAppearviewDidLoad 中都使用tableview.reloadData(),但是tableview 没有重新加载并且仍然显示它在应用启动时最初加载的数据,而不是新内容。

override func viewWillAppear(_ animated: Bool) {
        tableView.reloadData()
        weightArray = UserDefaults.standard.array(forKey: "favorites") as! [String]
    }

这就是我填充表格视图的方式:

// MARK: - Table view data source

    override func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }

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


    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cellIdentifier = "FavoriteCell"
        let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier, for: indexPath)

        let weights = weightArray[indexPath.row]
        cell.textLabel?.text = weights

        return cell
    }

【问题讨论】:

  • 试试viewWillAppear()
  • 您可以使用数据源的didSet 属性观察器重新加载您的tableView,但在您的情况下,这里可能会有额外的问题。如何更新另一个ViewController 中的数据源? Swift Arrays 是 structs 所以它们是值类型。如果更新数组,则必须将其映射回来。现在根据您的设计,我们将看看需要做什么。所以分享与此相关的代码。
  • viewWillAppear() 有效,但仅在将内容添加到数组之后才起作用。基本上,tableview 必须出现两次才能重新加载所有内容。 - 我已经添加了tableview数据源代码。
  • 标签栏没有再次加载 viewController,这就是为什么 viewDidLoad 和 viewDidAppear 不起作用。
  • @RjC 不是您在设置数组之前要求重新加载吗?

标签: ios arrays swift tableview


【解决方案1】:

您的reloadData() 调用是在更新数组之前。

应该是在更新数据源之后:

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

    weightArray = UserDefaults.standard.array(forKey: "favorites") as! [String]
    tableView.reloadData()    
}

无论如何,您可以使用数据源对象的didSet 属性观察器。

//your weightArray declaration
var weightArray = [String]() {
    didSet {
        tableView.reloadData()
    }
}

然后你可以这样做:

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

    weightArray = UserDefaults.standard.array(forKey: "favorites") as! [String]   
}

这样,每当您更改数组时,您的tableView 都会重新加载。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-09
    • 2016-08-04
    • 1970-01-01
    • 1970-01-01
    • 2021-11-13
    • 1970-01-01
    • 2018-01-12
    • 1970-01-01
    相关资源
    最近更新 更多