Как перезагрузить просмотр таблицы из другого контроллера представления в 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])