Когда dequeueReusableCell вернет ноль? - PullRequest
0 голосов
/ 14 апреля 2020

Я новичок в сцене программирования iOS, и недавно я наткнулся на несколько примеров кода в Интернете, таких как:

functableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    var cell = tableView.dequeueReusableCell(withIdentifier: customCellIdentifier, for: indexPath) as? CustomCell
    if (cell == nil) {
        cell = CustomCell(style: UITableViewCell.CellStyle.default, reuseIdentifier: customCellIdentifier) asCustomCell
        }
    ...
    }

Где автор пытался обработать событие, когда dequeueReusableCell возвращает ноль.

Но из-за моего ограниченного личного опыта с UITableView и пользовательскими ячейками мне еще не приходилось сталкиваться со временем, когда dequeueReusableCell вернул мне ноль.

Из исследования я обнаружил, что причина может быть

«Методы удаления… пытаются найти ячейку с заданным идентификатором повторного использования, которая в данный момент находится вне экрана. Если они находят одну, они верните эту ячейку, в противном случае они вернут ноль. "

из ответа МрТЖ здесь

Но такого никогда не случалось со мной. Когда я намеренно даю ему неправильный идентификатор, происходит ошибка во время выполнения, но ни разу не было возвращено ноль. Интересно, когда именно это произойдет, и если это действительно необходимо.

1 Ответ

2 голосов
/ 14 апреля 2020

Этот код неверен. Старая форма dequeueReusableCell без параметра indexPath возвращает nil, когда в пуле повторного использования нет доступной ячейки (т. Е. Когда впервые появляется табличное представление). В этом случае вы обязаны выделить ячейку.

Более новая форма dequeueResuableCell, показанная в вашем вопросе, всегда будет возвращать ячейку, поскольку она выделяет ячейку, если требуется.

Выражение в вашем вопросе может возвращать nil, если не удается выполнить условное снижение (то есть возвращенная ячейка не является экземпляром CustomCell).

Я бы сказал, что это где-то представляет собой серьезную неверную конфигурацию и должно быть найдено во время разработки. По этой причине обычно используется принудительное снижение. во время разработки вы получаете крэ sh, исправляете проблему и идете дальше.

let cell = tableView.dequeueReusableCell(withIdentifier: customCellIdentifier, for: indexPath) as! CustomCell

Код в вашем вопросе - это некая смесь Франкенштейна старого и нового.

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