Как перезагрузить просмотр таблицы из другого контроллера представления в swift

Когда я отклоняю модальный контроллер представления, я хочу обновить представление таблицы, я использую стиль представления листа формы на iPad так, чтобы viewWillAppear и viewDidAppear методы не будут работать

3 ответа

Решение

Код версии 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)

Вы можете сделать это:

В вашем контроллере tableView:

   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()
    }

Затем в другом View Controller:

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

Вместо этой запятой в этой строке должно быть:

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

Я считаю подход более элегантным.

Допустим, у нас есть 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 выполните следующие действия (с идентификатором, который мы установили в инспекторе ранее):

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

Теперь, когда вы используете Segue, чтобы вернуться к ViewControllerA, ViewControllerA обновит TableView сразу.

Альтернативное решение: переопределить UIViewController "s dismiss(animated:completion:) метод в контроллере представления, который управляет табличным представлением (и представляет другое представление модально), поэтому вы можете перезагрузить таблицу:

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

    self.tableView.reloadData()    
}

Примечание. Это должно работать, даже если вы вызываете dismiss(animated: завершением:) на самом контроллере модального представления (жизнеспособная альтернатива), потому что в конечном итоге вызов передается в представляющий контроллер представления.

Из документации метода:

Контроллер представления представляет ответственность за отклонение представленного контроллера. Если вы вызываете этот метод на самом представленном контроллере представления, UIKit просит, чтобы представляющий контроллер представления обработал отклонение.

(акцент мой)

Вы можете использовать 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])
Другие вопросы по тегам