UITableViewCell Повторное использование вызывает проблемы [с изображениями]! - PullRequest
5 голосов
/ 12 июля 2011

Картина стоит тысячи слов, и я предполагаю, что фотографии, представленные ниже, ясно отражают проблему, с которой я сталкиваюсь сейчас.

Вот небольшое резюме:

Я создаю tableView, и каждый tableViewCell имеет textField в качестве подпредставления. Я прокручиваю вверх и вниз, и мой взгляд портится. Я предполагаю, что это из-за Cell Reusability. Но мне нужна помощь с этим.

Примечание : Эта проблема не из-за кнопок или uitextView в нижней части экрана. Если у меня их нет, и у меня есть только первые три раздела, textFields сдвигается, и это портит текстовые поля нескольких ячеек. Также обратите внимание на сдвиг textField на изображении 4 по сравнению с другими изображениями. Код вставлен сюда http://www.pastie.org/2203340

**P.S.:**   I have added the solution to the problem at the end of the question. 

Это мой обычный вид

enter image description here

Это когда я прокручиваю вниз (смотри ниже)

enter image description here

После нескольких прокруток вверх и вниз ... (см. Ниже) enter image description here

После нескольких свитков ... (см. Ниже) enter image description here

РЕШЕНИЕ:

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

Используйте UITableViewCells с различными CellIdentifiers. Это обеспечит, что одна и та же ячейка не будет вызвана.

Ответы [ 3 ]

9 голосов
/ 12 июля 2011

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

В любом случае, корень вашей проблемы в следующем коде:

if (section ==3){
    cell =nil;
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    cell.selectionStyle = UITableViewCellSelectionStyleNone;

    if (indexPath.row ==0){
        cell.backgroundColor = [UIColor clearColor];
        cell.contentMode = UIViewContentModeScaleToFill;
        [cell.contentView addSubview:self.footerView];
    }
}

Для этой конкретной ячейки вы устанавливаете цвет фона, чтобы очистить, добавляете footerView и т. Д. Но вы не устанавливаете цвет фона ни для одной из других ячеек, так как только этот конкретныйЯчейка может быть повторно использована в другой позиции, вы получите чистый фон и другие изменения в этой позиции.

Теперь, вероятно, будет легче понять, почему вы можете использовать разные идентификаторы ячеек.для разных типов клеток.Если для прозрачных ячеек вы используете другой идентификатор, чем для белых, вам не нужно беспокоиться о том, что прозрачные ячейки перерабатываются в виде белых и наоборот.Вы должны использовать разные идентификаторы для каждого «типа ячейки», где «тип ячейки» определяется всеми атрибутами ячейки, которые вам не нужно настраивать при каждом повторном использовании ячейки.

You 'Вы выполняете большую работу в вашем -reuseTableViewCellWithIdentifier:withIndexPath: методе, который в итоге делает ячейки не очень многоразовыми.Вместо этого вы должны идентифицировать каждый отдельный «тип» или «стиль» ячейки, которую вы хотите отображать независимо от конкретной информации, отображаемой в них.Например, все ячейки в первых трех разделах выглядят примерно одинаково: все они похожи на стандартный стиль ячейки UITableViewCellStyleValue1, за исключением того, что метка сведений оставлена ​​пустой и текстовое поле добавлено с правой стороны.,Тогда используйте один и тот же идентификатор повторного использования для всех этих ячеек.-reuseTableViewCellWithIdentifier:withIndexPath: действительно не должно заботиться о пути индекса - он должен просто создать и вернуть ячейку в требуемом стиле, как определено предоставленным идентификатором повторного использования.Оставьте работу по настройке текста полей в этих ячейках для метода -tableView:cellForRowAtIndexPath:.

Я заметил, что вы сохраняете путь индекса и указатель на текстовое поле при создании каждой ячейки.Ничто из этого не поможет, если вы повторно используете ячейки.

Если вы никогда не собираетесь добавлять больше ячеек в таблицу, чем те, которые вы показывали, вам может быть прощепросто пропустите всю вещь повторного использования.Повторное использование ячеек дает заметное улучшение производительности при прокрутке таблицы с десятками или сотнями ячеек, но если у вас никогда не будет больше десяти или пятнадцати ячеек, а половина из них будет на экране в любой момент времени, преимущество повторного использованияклетки не так уж велики.Тем не менее, я бы посоветовал вам потратить время, чтобы обдумать идею;рано или поздно вам захочется создать таблицу с множеством строк.

1 голос
/ 12 июля 2011

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

0 голосов
/ 12 июля 2011

Один из способов, который должен это исправить, - установить для всех ячеек значение nil в вашем методе cellForRowAtIndexPath.Это гарантирует, что каждый будет нарисован заново без шансов наложения чего-либо, как на ваших изображениях.Недостатком является то, что это дополнительная работа для системы, потому что она не может повторно использовать ячейки так, как она хочет

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