如何快速从另一个视图控制器重新加载表格视图

Posted

技术标签:

【中文标题】如何快速从另一个视图控制器重新加载表格视图【英文标题】:How to reload tableview from another view controller in swift 【发布时间】:2014-11-13 07:44:45 【问题描述】:

当我关闭想要更新表格视图的模态视图控制器时,我在 iPad 上使用表单呈现样式,因此 viewWillAppearviewDidAppear 方法将不起作用

【问题讨论】:

你可以使用 NSNotificationCenter 来触发更新你的 tableview 的方法。 你能告诉我怎么做吗,我对 NSNotificationCenter 不是很熟悉,谢谢 【参考方案1】:

你可以这样做:

在您的 tableView 控制器中:

override func viewDidLoad() 
    super.viewDidLoad()
    NotificationCenter.default.addObserver(self, selector: #selector(loadList), name: NSNotification.Name(rawValue: "load"), object: nil)

 
@objc func loadList(notification: NSNotification)
    //load data here
    self.tableView.reloadData()

然后在另一个 ViewController 中:

NotificationCenter.default.post(name: NSNotification.Name(rawValue: "load"), object: nil)

【讨论】:

由于某种原因这对我不起作用。我在//load data here 行添加了一个断点,但表格视图没有显示添加的新数据 谢谢,这个完美的解决方案,我一直在寻找这样的东西。 为我工作,我什至从一个单独的类中调用了 postNotificationName 函数,甚至不是视图控制器 @ZackShapiro 尝试设置 dispatch_async(dispatch_get_main_queue(), self.tableView.reloadData() );而不是 self.tableView.reloadData() ,它对我有用 这个答案应该被标记,它有效,它干净易懂。【参考方案2】:

这一行缺少逗号,应改为:

NSNotificationCenter.defaultCenter().addObserver(self, selector: "loadList:", name:"load", object: nil)

【讨论】:

【参考方案3】:

我发现 segue 方法更优雅。

假设我们有ViewControllerAViewControllerB。我们在ViewControllerB,我们希望从ViewControllerB 直接跳回ViewControllerA 并更新ViewControllerA 中的表格视图。

ViewControllerA 中,在您的 ViewController 类中添加以下操作:

@IBAction func unwindToViewControllerA(segue: UIStoryboardSegue) 
    DispatchQueue.global(qos: .userInitiated).async 
        DispatchQueue.main.async 
            self.tableView.reloadData()
        
    

是的,这段代码在你要返回的 ViewController 的 ViewController 中!

现在,您需要从ViewControllerB 的故事板 (StoryboardB) 创建一个退出转场。继续打开StoryboardB 并选择故事板。按住CTRL并拖动退出如下:

您将获得一个可供选择的 segue 列表,其中包括我们刚刚创建的一个:

你现在应该有一个segue,点击它:

进入检查器并设置一个唯一的ID:

ViewControllerB 中您要关闭并返回ViewControllerA 的位置,执行以下操作(使用我们之前在检查器中设置的id):

self.performSegue(withIdentifier: "yourIdHere", sender: self)

现在,每当您使用 segue 返回到 ViewControllerA 时,ViewControllerA 都会立即更新 TableView。

【讨论】:

【参考方案4】:

另一种解决方案: 覆盖视图控制器上的 UIViewControllerdismiss(animated:completion:) 方法,该方法管理表视图(并以模态方式显示另一个),因此您可以重新加载表:

override func dismiss(animated flag: Bool, completion: (() -> Void)? = nil) 
    super.dismiss(animated: flag, completion: completion)

    self.tableView.reloadData()    

注意:即使您在模态视图控制器本身上调用dismiss(animated:completion:) 也应该可以工作(一个可行的替代方案),因为最终调用会被转发到presenting 视图控制器。

来自方法的文档:

呈现视图控制器负责关闭它呈现的视图控制器。如果您在 presenting 视图控制器本身上调用此方法,UIKit 会要求 presenting 视图控制器处理解除。

(强调我的)

【讨论】:

【参考方案5】:

您可以使用 NotificationCenter 来更新您的表格视图。

首先添加观察者...

NotificationCenter.default.addObserver(self, selector: #selector(doThisWhenNotify(notification:)), name: NSNotification.Name(rawValue: "load"), object: nil)

func doThisWhenNotify(notification : NSNotification) 
    let info = notificatio.userInfo
    //update tableview


在其他 ViewController 上发布

NotificationCenter.default.post(name: NSNotification.Name(rawValue: "load"), object: nil, userInfo: [String : Any])

【讨论】:

【参考方案6】:

Swift 3 版本代码: 在您的第一个视图控制器中:

override func viewDidLoad() 
        super.viewDidLoad()
        NotificationCenter.default.addObserver(self, selector: #selector(loadList), name: NSNotification.Name(rawValue: "load"), object: nil)
    

func loadList()
        //load data here
        self.tableView.reloadData()
    

在您的第二个视图控制器中:

NotificationCenter.default.post(name: NSNotification.Name(rawValue: "load"), object: nil)

【讨论】:

第二个VC在哪里? 第二个视图控制器中您认为是时候更新 tableView 可能性的任何地方是:方法、viewDidLoad 或代码的任何部分。希望对您有所帮助 伟大的救生解决方案!

以上是关于如何快速从另一个视图控制器重新加载表格视图的主要内容,如果未能解决你的问题,请参考以下文章

快速从另一个视图控制器更改 webview 的 url

如何通过iOS Objective C中的appDelegate从另一个视图控制器重新加载表视图

关闭并显示按钮上的视图单击从另一个视图

如何从另一个 UIViewController 重新加载 UITableViewController

动画视图控制器并同时在表格视图中重新加载数据

无法在标签栏控制器中重新加载表格视图