Значения перепутаны, потому что когда вы выходите за пределы экрана и затем перезагружаете таблицу, ячейки извлекаются из внутреннего пула ячеек таблицы, но они не перезагружаются в том же порядке, в котором они были в таблице ранее. Обратите внимание, что это смешивание произойдет, даже если у вас есть таблица с множеством строк, и вы прокручиваете ее. Решение состоит в том, чтобы сохранить данные текстового поля в массиве «источник данных» и затем настроить ячейку.
ПОЯСНЕНИЯ
По сути, в вашем коде есть один главный концептуальный недостаток: после регенерации ячейки вы не конфигурируете контент должным образом (вы его вообще не конфигурируете). Я имею в виду, что изначально, когда таблица отображается в первый раз, пул пуст. Таким образом, каждая новая ячейка, которая должна отображаться, воссоздается с нуля (а не извлекается из пула); допустим, ваша таблица может отображать 10 ячеек на экране, поэтому первые 10 ячеек будут созданы с нуля с пустыми текстовыми полями.
Затем вы начинаете вводить текст в эти поля, и все работает правильно.
В определенный момент вы начинаете прокручивать ячейку: происходит то, что все ячейки, которые находятся вверху, исчезают с экрана и сохраняются (помещаются в очередь) в пуле таблиц с их текстовым полем и отредактированным содержимым; скажем, вы ставите ячейку в очередь в строке 0. Когда в нижней части экрана должна отображаться новая ячейка, первое, что делает ваш код, это пытается заблокировать ячейку. Теперь на этот раз у вас есть ячейка в пуле (ячейка, которая была в строке 0), эта ячейка извлекается из пула и помещается в таблицу, ВКЛЮЧАЯ СОДЕРЖАНИЕ ТЕКСТОВОГО ПОЛОЖЕНИЯ, в строке 11. Итак, «волшебным образом» вы найдете текст, отредактированный в строке 0 в другой строке, 11. Кроме того, ячейки извлекаются из пула в разреженном порядке, поэтому после многих редактирования и прокрутки текстового поля у вас будет полное смешение.
Решение, и это является причиной ошибки в вашем коде: как только ячейка будет создана или отключена, настройте ее, то есть задайте содержимое текстового поля. Как получить содержимое текстового поля? хранить в массиве. Вот почему ваш контроллер представления является «источником данных», потому что вы вводите данные для заполнения таблицы. Хранение данных в таблице является ошибкой из-за этого механизма блокировки. Пример:
groupNameTextField.text=[myTextFieldContentArray objectAtIndex:indexPath.row];
Другое решение, но я не предлагаю его, это назначить уникальный идентификатор каждой ячейке, а именно:
NSString *myCellId = [NSString stringWithFormat:@"CellID_%d_%d",indexPath.section,indexPath.row];
В этом случае всем ячейкам будет присвоено другое имя, и вы никогда их не перепутаете.
Это решение работает большую часть времени, но не рекомендуется по двум причинам:
а. это неоптимально, так как вы не используете ячейки повторно, и это требует дополнительной памяти для похожих ячеек
б. вы не гарантированы, что каждая ячейка находится в эффективной очереди, в целом эта логика находится внутри таблицы и не предоставляется разработчикам, поэтому может случиться так, что вам придется заново генерировать ячейку каждый раз, когда это необходимо (потеря производительности) .