当我解雇模态视图控制器时,我希望更新tableview,我在iPad上使用表单表示样式,因此viewWillAppear
和viewDidAppear
方法无法正常工作
答案 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键并拖动以退出,如下所示:
系统会为您提供一系列的选择,包括我们刚刚创建的选择:
您现在应该拥有一个segue,单击它:
在ViewControllerB
上您要撤消并返回到ViewControllerA
的位置,执行以下操作(使用我们先前在检查器中设置的ID):
self.performSegue(withIdentifier: "yourIdHere", sender: self)
现在,每当您使用segue返回到ViewControllerA
时,ViewControllerA
都会立即更新TableView。