Ячейка таблицы не перерабатывается, если в ней содержится первый респондент - PullRequest
1 голос
/ 24 апреля 2020

У меня есть UITableView с 30 предметами. Высота строки - stati c, и в зависимости от размера таблицы, в каждый момент времени существует приблизительно 8 ячеек. Каждая клетка имеет один UITextField и все. Запутанная часть - когда я начинаю редактировать, скажем, текстовое поле в ячейке в строке 0. Что происходит, все работает так, как я ожидал, пока строка не прокручивается из видимости (пока ее текстовое поле остается первым респондентом). Я ожидаю, что ячейка внизу строки также будет иметь текстовое поле с первым статусом респондента, так как это ячейка, которая только что редактировалась, но была переработана для другой строки - этого никогда не происходит.

Ячейка в строка 0 продолжает удерживать статус первого респондента. Я знаю это, потому что я продолжаю печатать, пока прокручиваюсь до самого дна (ячейка из первого ряда к тому времени обычно перерабатывается), и то, что я набрал, видно в ячейке в строке 0 после прокрутки назад к вершине.

Чтобы было ясно, это поведение, которое я хочу, но я нигде не нашел его документированным, поэтому я устаю зависеть от него. Текст, введенный в текстовое поле ячейки, сохраняется как свойство name модели, и странное поведение возникло бы, если бы пользователь думал, что он редактирует имя модели в строке 0, но из-за будущего изменения iOS SDK, они заканчивают тем, что фактически редактировали название модели в любой строке, в которой находится ячейка, когда они печатают.

1 Ответ

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

Я предполагаю, что Apple добавила .keyboardDismissMode, чтобы упростить повторное заполнение текстового поля (automati c).

Из документов Apple dequeueReusableCell (withIdentifier:) :

В табличном представлении поддерживается очередь или список UITableViewCell объектов, для которых источник данных отметил для повторное использование.

Что, по-видимому, указывает на то, что в некоторых случаях (например, в этом) объекты UITableViewCell будут не доступны для повторного использования.

Мы можем хотя бы подтвердить это, проверив очередь вместе с видимыми ячейками:

print(tableView.value(forKey: "_reusableTableCells"))
tableView.visibleCells.forEach {
    print($0)
}

Если мы просмотрим это при прокрутке вверх и вниз, мы можем увидеть используемые клетки и помещенные в очередь.

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

Означает ли это, что это поведение никогда не изменится? Я не мог тебе сказать.

Но объединение этой информации с тем фактом, что UITextField не resignFirstResponder просто помещает его за рамки / границы своего суперпредставления, приводит меня к мысли, что такое поведение задуманно.

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