Когда я отклоняю контроллер модального представления, я хочу обновить tableview, я использую стиль презентации листа формы на iPad, поэтому методы viewWillAppear
и viewDidAppear
не будут работать
Как перезагрузить табличное представление с другого контроллера представления в быстром
Ответ 1
Код версии 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
Вы можете сделать это:
В вашем контроллере 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()
}
Затем в другом ViewController:
NotificationCenter.default.post(name: NSNotification.Name(rawValue: "load"), object: nil)
Ответ 3
Вместо этой запятой в этой строке должно быть:
NSNotificationCenter.defaultCenter().addObserver(self, selector: "loadList:", name:"load", object: nil)
Ответ 4
Альтернативное решение: переопределить UIViewController
dismiss(animated:completion:)
на контроллере представления, который управляет табличным представлением (и представляет другой вариант), поэтому вы можете перезагрузить таблицу:
override func dismiss(animated flag: Bool, completion: (() -> Void)? = nil) {
super.dismiss(animated: flag, completion: completion)
self.tableView.reloadData()
}
Примечание. Это должно работать, даже если вы вызываете увольнение (анимированное: завершение :) на сам контроллер модального просмотра (жизнеспособная альтернатива), потому что в конечном итоге вызов получает ретранслирование на контроллер представления представления.
Из метода docs:
Контроллер представления представления отвечает за отклонение контроллера представления, который он представил. Если вы вызываете этот метод на представленном контроллере представления, UIKit просит контроллер представления представления обрабатывать увольнение.
(акцент мой)
Ответ 5
Вы можете использовать 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])
Ответ 6
Я считаю подход более элегантным.
Допустим, у нас есть ViewControllerA
и ViewControllerB
. Мы находимся в ViewControllerB
и хотим, чтобы ViewControllerB
сразу ViewControllerA
обратно на ViewControllerA
и 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)
Теперь, всякий раз, когда вы используете переход для возврата к ViewControllerA
, ViewControllerA
обновит TableView.