Подтвердить что ты не робот

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

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

4b9b3361

Ответ 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, перетащите для выхода следующим образом:

enter image description here

Вам будет предоставлен список сегментов на выбор, включая тот, который мы только что создали:

enter image description here

Теперь у вас должен быть переход, нажмите на него:

enter image description here

Зайдите в инспектор и установите уникальный идентификатор: enter image description here

В ViewControllerB в точке, где вы хотите закрыть и вернуться к ViewControllerA, выполните следующее (с идентификатором, который мы установили в инспекторе ранее):

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

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