Разница между tableView.cellForRow (at :) и tableView.dataSource - tableView (tableView: cellForRowAt :) - PullRequest
0 голосов
/ 12 декабря 2018

Я тестирую юнит на tableView, отображает ли он ячейку.

И я обнаружил, что tableView.cellForRow(at:) возвращает ноль, а tableView.dataSource?tableView(tableView:cellForRowAt:) возвращает правую ячейку.

Вот мой код модульного теста.

it("renders one option text") {
    let indexPath = IndexPath(row: 0, section: 0)

    let cell = sut.tableView.dataSource?.tableView(sut.tableView, cellForRowAt: indexPath)

    let cell2 = sut.tableView.cellForRow(at: indexPath)

    expect(cell?.textLabel?.text).toEventually(equal("A1"))  // test suceeded
    expect(cell2?.textLabel?.text).toEventually(equal("A1")) // test failed
}

Так что мне любопытно различие между этими двумя методами.

В документе Apple говорится, что tableView.cellForRow(at:) возвращает ноль, если ячейка не видна,поэтому я понял, что tableView.cellForRow(at:) возвращает ноль, когда он проходит модульное тестирование, но я не уверен, что порядок времени двух вызываемых методов и , когда tableView.cellForRow(at:) получает правильное значение(клетка) .

Ответы [ 2 ]

0 голосов
/ 12 декабря 2018
 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell

Этот метод используется для генерации или удаления ячеек в соответствии с требованиями tableView.Это не метод члена UITableView.Вместо этого это метод протокола, а другой объект, который будет источником данных, будет реализовывать и возвращать значение.Поэтому он всегда будет возвращать ячейку, независимо от того, проводим ли мы модульное тестирование или отлаживаем приложение.

tableView.cellForRow(at:) 

Этот метод не является методом генератора.Это метод-член UITableView в качестве вспомогательного метода, например, для.для получения выбранной строки мы используем tableView.selectedRow.Так что предполагается вернуть ячейку для любого indexPath.

Как мы знаем, UITableView не создает ячейки, равные нарисованным строкам.Предположим, что вы хотите нарисовать 100 строк, тогда UITableView создаст только несколько дополнительных ячеек, кроме видимых ячеек.Поэтому, если вы передадите какой-либо indexPath, которого нет среди видимых строк, то практически эта ячейка не существует.Потому что просмотр таблицы ждет вас, чтобы прокрутить и повторно использовать неиспользуемые ячейки.Поэтому, проводите ли вы модульное тестирование или работаете над приложением, оно всегда будет показывать ноль для ячеек, которые не видны.

0 голосов
/ 12 декабря 2018

tableView.dataSource?tableView(tableView:cellForRowAt:) всегда удаляет новую ячейку из очереди.Это не то, что отображается, если только tableView не вызвало его.

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