Когда вызывается CellForRowAt?- В очереди до ВК на вершине? - PullRequest
0 голосов
/ 10 мая 2019

У меня есть два контроллера представления, A и B.

A имеет табличное представление.

A обернуто в контроллер навигации, который позволяет ему выдвигать к B. B есть обработчик, которыйзвонки tableView.reloadData().Однако метод cellForRowAt не вызывается в A до тех пор, пока не появится B, и A снова не станет видимым.

Существует ли формальная документация, в которой говорится, что cellForRowAt вызывается только тогда, когда VC является верхним контроллером представления?Это желаемый результат, и я хочу убедиться, что это произойдет.

image

-- denotes action
// denotes current VC
console denotes print message

//AVC:
--push to BVC
//BVC:
--press handler Button
console: "handling"
console: "nil"
console: "numberOfRowsInSection"
--press back navigation
console: "Disappearing"
//AVC:
console: "CellForROwAt"

Список файлов для воспроизведения

https://gist.github.com/MochaTheCoder/628af8950f39e5fc0896cc12d77c6fb2

- код -

class AViewController: UIViewController {

    @objc private func pushBVC() {
        let bVC = BViewController()
        bVC.handler = {
            print("handling")
            print(self.view.window)
            self.tableView.reloadData()
        }
        navigationController?.pushViewController(bVC, animated: true)
    }

}

extension AViewController: UITableViewDataSource {
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        print("numberOfRowsInSection")
        return 1
}
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        print("CellForROwAt")
        return UITableViewCell()
    }
}

----

class BViewController: UIViewController {

    var handler: (() -> Void) = {}

    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        print("Disappearing")
    }

    @objc private func doHandler() {
        handler()
    }

}

Ответы [ 2 ]

1 голос
/ 10 мая 2019

При нажатии на 2-й контроллер вида первый контроллер вида фактически удаляется из окна.Таким образом, во время вызова reloadData табличное представление не находится в иерархии окон, поэтому оно не обновляется в это время.

Во время процесса закрытия контроллера 2-го представления и первогоодин снова показывается, он добавляется обратно в иерархию окон (вместе с табличным представлением), и табличное представление использует это событие для обновления себя с ожидающими обновлениями.

Вот почему вы не видитевызов cellForRowAt до тех пор, пока не появится сообщение print("Disappearing").

Таким образом, таблица не обновляется, когда она не видна, она не обновляется, пока не является частью иерархии окон.

0 голосов
/ 10 мая 2019

Функция cellForRowAt вызывается каждый раз, когда UITableView требуется отобразить ячейку для определенного IndexPath, будь то из-за того, что родительский элемент ViewController только что был загружен, и таблица должна быть отображена, или потому что пользователь прокручивает tableView и новые ячейки должны стать видимыми.

Имейте в виду, что сами клетки можно использовать повторно. Когда IndexPath больше не виден, ячейка перерабатывается и используется повторно для IndexPath, которые собираются прокрутить на экран. Когда tableView прокручивается обратно к ранее просмотренному IndexPath, для этого IndexPath снова вызывается cellForRowAt, и используется вновь удаленная ячейка правильного типа.

Все это должно происходить только тогда, когда tableView виден. Он не должен быть верхним ViewController. На iPad с модальным режимом на переднем плане tableView все еще можно прокручивать в фоновом режиме, и cellForRowAt будет по-прежнему вызываться по мере необходимости. Это может произойти даже на iPhone с предупреждением в верхней части экрана. Пока табличное представление отображается, и новая ячейка IndexPath должна появиться, будет вызван cellForRowAt. Для большинства ситуаций на экране iPhone со стандартным ViewControllers это обычно происходит только на самом верхнем ViewController.

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