it-roy-ru.com

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

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

30
Suneet Tipirneni

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

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

В вашем контроллере 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)
66
Sebastian

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

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

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

Альтернативное решение: переопределить метод 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: complete :) на самом контроллере модального представления (жизнеспособная альтернатива), потому что в конечном счете вызов передается на контроллер представления presenting

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

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

(выделение мое)

0
Nicolas Miari