如何从swift中的另一个视图控制器重新加载tableview

时间:2014-09-18 20:18:42

标签: ios swift tableview

当我解雇模态视图控制器时,我希望更新tableview,我在iPad上使用表单表示样式,因此viewWillAppearviewDidAppear方法无法正常工作

6 个答案:

答案 0 :(得分:66)

你可以这样做:

在tableView Controller中:

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

func loadList(notification: NSNotification){
    //load data here
    self.tableView.reloadData()
}

然后在另一个ViewController中:

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

答案 1 :(得分:47)

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)

答案 2 :(得分:2)

此行上缺少逗号,应改为:

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

答案 3 :(得分:1)

替代解决方案:在视图控制器上覆盖UIViewController的{​​{1}}方法,该方法管理表视图(并以模态方式显示另一个视图),因此您可以重新加载表格然后:

dismiss(animated:completion:)

注意:即使您在模态视图控制器本身上调用dismiss(animated:completion:)(可行的替代方法),此方法也应该起作用,因为最终该调用将中继到展示视图控制器。

从方法的文档中获取

  

呈现视图控制器负责解散其呈现的视图控制器。如果您在 presented 视图控制器本身上调用此方法,则UIKit会要求 presenting 视图控制器处理该撤消。

(重点是我的)

答案 4 :(得分:0)

您可以使用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])

答案 5 :(得分:0)

我发现segue方法更优雅。

假设我们有ViewControllerA和一个ViewControllerB。我们在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键并拖动以退出,如下所示:

enter image description here

系统会为您提供一系列的选择,包括我们刚刚创建的选择:

enter image description here

您现在应该拥有一个segue,单击它:

enter image description here

进入检查器并设置唯一的ID: enter image description here

ViewControllerB上您要撤消并返回到ViewControllerA的位置,执行以下操作(使用我们先前在检查器中设置的ID):

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

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