web-dev-qa-db-ja.com

swiftで別のView ControllerからTableViewをリロードする方法

Tableviewを更新するモーダルビューコントローラーを閉じるとき、iPadのフォームシートプレゼンテーションスタイルを使用しているため、viewWillAppearおよびviewDidAppearメソッドは機能しません。

33

セグエのアプローチがよりエレガントだと思います。

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キーを押しながらドラッグして、次のように終了します。

enter image description here

作成したセグエを含むセグエのリストが表示されます。

enter image description here

これでセグエが表示されます。クリックしてください:

enter image description here

インスペクターに移動して、一意のIDを設定します: enter image description here

ViewControllerBを閉じてViewControllerAに戻るポイントで、次の操作を行います(以前にインスペクターで設定したIDを使用)。

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

これで、セグエを使用してViewControllerAに戻るたびに、ViewControllerAがTableViewをすぐに更新します。

0
Rafael

あなたはこれを行うことができます:

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)
67
Sebastian

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)
47
mriaz0011

この行にコンマがない場合、代わりに次のようになります。

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

代替ソリューション: Table Viewを管理するView Controller上のUIViewControllerdismiss(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に解雇を処理するように要求します。

(エンファシス鉱山)

1
Nicolas Miari

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])
0
Deep