【问题标题】:How to reload data in a TableView from a different ViewController in Swift如何在 Swift 中从不同的 ViewController 重新加载 TableView 中的数据
【发布时间】:2015-08-12 23:52:39
【问题描述】:

在 ViewController 中,我试图在另一个 ViewController 中的 TableView 中重新加载数据,如下所示:

    (self.presentedViewController as! tableViewController).table.reloadData()

tableViewController 是 TableView 控制器中的类(我知道这不是大写的驼峰式),而 table 是 TableView。好吧,这样做会产生“致命错误:在展开可选值时意外发现 nil”,我想这是有道理的,因为“presentedViewController”尚未加载。 我也试过这个:

    (self.navigationController!.viewControllers[self.navigationController!.viewControllers.count - 2] as! tableViewController).table.reloadData()

这产生了相同的结果(我确保 tableViewController 在 navigationController 堆栈上的当前 ViewController 下)。我对我应该做什么感到困惑......我觉得在不同的视图控制器中引用属性应该更容易。我可能有点含糊;如果我是,请告诉我你需要知道什么!

【问题讨论】:

  • 我试图了解您为什么要这样做。视图控制器通常应该处理自己的属性,而不是告诉其他视图控制器该做什么。也许有更好的方法来解决您的问题?

标签: ios swift uiviewcontroller reloaddata


【解决方案1】:

Xcode 9 • Swift 4

创建通知名称:

extension Notification.Name {
    static let reload = Notification.Name("reload")
}

您可以发布通知

NotificationCenter.default.post(name: .reload, object: nil)

并在要重新加载数据的视图控制器上添加一个观察者:

override func viewDidLoad() {
    super.viewDidLoad()
    NotificationCenter.default.addObserver(self, selector: #selector(reloadTableData), name: .reload, object: nil)
}

@objc func reloadTableData(_ notification: Notification) {
    tableView.reloadData()
}

【讨论】:

  • 但是如果我不在那个 tableView 上意味着在另一个页面或视图控制器上,.. 那时 NSNotificationCenter.defaultCenter() 部分将永远不会发生,因为它当时从未加载过..那么怎么能我处理它。
  • @Leo,首先,感谢您提供非常有帮助的答案。其次,你显然比我更了解 Swift,所以我想知道你能否解释一下是什么让 Xcode 的版本具有相关性。甚至 Swift language page 也没有引用运行 Swift 3.1 所需的 Xcode 版本。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-23
  • 2018-12-16
  • 1970-01-01
  • 2014-05-09
  • 2020-03-25
  • 2021-05-28
相关资源
最近更新 更多