Ios 如何在Swift中从不同的ViewController重新加载TableView中的数据

Ios 如何在Swift中从不同的ViewController重新加载TableView中的数据,ios,swift,uiviewcontroller,reloaddata,Ios,Swift,Uiviewcontroller,Reloaddata,在ViewController中,我尝试在另一个ViewController的TableView中重新加载数据,如下所示: (self.presentedViewController as! tableViewController).table.reloadData() 其中tableViewController是TableView的控制器中的类(我知道它不是大写),table是TableView。这样做会产生“致命错误:在展开可选值时意外发现nil”,我想这是有道理的,因为“pres

在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下)。我对我应该做什么感到困惑…我觉得在不同的视图控制器中引用属性应该更容易。我可能有点含糊不清;如果我是,告诉我你需要知道什么

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 3.1所需的Xcode版本。