Tableviewを更新するモーダルビューコントローラーを閉じるとき、iPadのフォームシートプレゼンテーションスタイルを使用しているため、viewWillAppear
およびviewDidAppear
メソッドは機能しません。
セグエのアプローチがよりエレガントだと思います。
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キーを押しながらドラッグして、次のように終了します。
作成したセグエを含むセグエのリストが表示されます。
これでセグエが表示されます。クリックしてください:
ViewControllerB
を閉じてViewControllerA
に戻るポイントで、次の操作を行います(以前にインスペクターで設定したIDを使用)。
self.performSegue(withIdentifier: "yourIdHere", sender: self)
これで、セグエを使用してViewControllerA
に戻るたびに、ViewControllerA
がTableViewをすぐに更新します。
あなたはこれを行うことができます:
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)
Swift 3バージョンコード:最初のView Controller:
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()
}
2番目のView Controllerで:
NotificationCenter.default.post(name: NSNotification.Name(rawValue: "load"), object: nil)
この行にコンマがない場合、代わりに次のようになります。
NSNotificationCenter.defaultCenter().addObserver(self, selector: "loadList:", name:"load", object: nil)
代替ソリューション: Table Viewを管理するView Controller上のUIViewController
のdismiss(animated:completion:)
メソッドをオーバーライドし(そしてもう一方をモーダルに提示する)、テーブルをリロードできますその後:
override func dismiss(animated flag: Bool, completion: (() -> Void)? = nil) {
super.dismiss(animated: flag, completion: completion)
self.tableView.reloadData()
}
注:これは、モーダルビューコントローラー自体(実行可能な代替)でdismiss(animated:completion :)を呼び出した場合でも機能するはずです。最終的に、呼び出しはpresentingView Controller。
メソッドのドキュメントから:
表示するView Controllerは、表示するView Controllerを削除します。 presented View Controller自体でこのメソッドを呼び出すと、UIKitはpresenting View Controllerに解雇を処理するように要求します。
(エンファシス鉱山)
NotificationCenterを使用して、Tableviewを更新できます。
最初にオブザーバーを追加...
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])