Табличное представление не обновляется при вызове из другого View Controller с помощью NotificationCenter - PullRequest
1 голос
/ 05 апреля 2020

У меня есть табличное представление в одном контроллере представления. Я хочу обновить табличное представление от другого V C. Я делаю это с помощью NotificationCenter следующим образом:

В табличном представлении V C:

override func viewDidLoad() {
    super.viewDidLoad()

    NotificationCenter.default.addObserver(self, selector: #selector(self.updateTableView), name: NSNotification.Name(rawValue: "updateTableView"), object: nil)
}

@objc func updateTableView() {
    print("in func")
    DispatchQueue.main.async {
        self.listTV.reloadData()
    }
}

В открытом V C:

func reloadTV() {
       NotificationCenter.default.post(name: NSNotification.Name(rawValue: "updateTableView"), object: nil)
}

print работает, но табличное представление не перезагружается. Я могу только увидеть, как он меняется, если я отклоню V C с представлением таблицы и снова открою его.

Я следовал советам других ответов, которые должны использовать DispatchQueue, но это не имело значения. Чего мне не хватает?

Большое спасибо!

Ответы [ 3 ]

0 голосов
/ 05 апреля 2020

Когда вы вызываете tableView.reloadData (). Это не имеет никакого эффекта, если tableView скрыт (isHidden == true). Я считаю, что поведение также то же самое, когда tableView эффективно скрыт другим ViewController (так эффективно скрыт).

Решение. Рекомендуется перезагрузить tableView при повторном отображении представления. Несколько способов сделать это. один находится в viewDidAppear (зависит от того, как вы переходили между ViewControllers), или

вы можете сохранить ссылку на tableView, а после того, как вы отклоните второй ViewController (в который вы отправляли уведомление), вы предоставляете обратный вызов для перезагрузите tableView. Примерно так же, как фрагмент, при котором self является secondViewController , на который вы перешли. Откажитесь от этого представления

  self.dismiss(animated: true, completion: {
            self.tableView.reloadData()
        }

, или вы все еще можете использовать свое уведомление и установить флаг, и когда viewDidAppear, вы затем перезагрузите Data () внутри viewDidAppear. Однако, чтобы это работало, вам нужно убедиться, что viewDidAppear всегда вызывается при повторном отображении представления (это будет зависеть от того, как вы переходили между представлениями). Просто переопределите этот метод и напечатайте для проверки.

Есть другие способы, но нижняя строка tableView.reloadData () будет игнорироваться, если она вызывается, когда tableView не виден на экране. Я предполагаю, что это оптимизация, сделанная Apple (не нужно перезагружать, если таблица не отображается) или, возможно, ошибка. Я думаю, они скажут, что это особенность 101

0 голосов
/ 06 апреля 2020

Я предлагаю вместо использования NotificationCenter установить вместо Bool, tableViewNeedsUpdate и проверить значение этого Bool при представлении вида с UITableView и UITableView виден и может принимать reloadData() звонки. После завершения перезагрузки установите для переменной значение false.

0 голосов
/ 05 апреля 2020

Я бы подумал сделать это по протоколу и делегировать вместо уведомлений ... Вот как я это делаю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...