UITableView подпредставление появляется в неправильном разделе при прокрутке? - PullRequest
0 голосов
/ 12 сентября 2011

В UITableView я добавляю UIView в качестве подпредставления, но ТОЛЬКО для раздела 1. Содержимое раздела 1 загружается из plist, а plist содержит изменяемый контент. Если строк, достаточных для прокрутки, достаточно, то происходит следующее: я прокручиваю до конца и возвращаюсь назад, и UITextField случайно появляется в некоторых ячейках раздела 0. Понятия не имею, почему это происходит! Итак, что я делаю, это (в «cellForRowAtIndexPath »):

if (indexPath.section == 0) {
    //do stuff
}
else if (indexPath.section == 1) {
    d = [UIView alloc] init];
    [cell.contentView addSubview:d];
}

и это полностью запутано, когда я прокручиваю Подвиды появляются в разделе 0, где они звучат, и на didSelectRowAtIdexPath я перезагружаюсь для раздела 1, а затем подпредставления даже появляются дважды (друг над другом) ... Это полный MESS! Пожалуйста, пожалуйста, помогите .......

Ответы [ 3 ]

5 голосов
/ 12 сентября 2011

Без просмотра какого-либо кода это кажется проблемой, относящейся к повторно используемым ячейкам.То, что происходит, - то, что ячейки, которые прокручивались вне экрана, повторно используются для нового контента, который должен быть показан.Поэтому я считаю, что вам нужно провести различие в cellForRowAtIndexPath для разделов 0 и 1 и в основном использовать для них различный набор ячеек.

РЕДАКТИРОВАТЬ: Хорошо, я могу дать здесь представление о вашей проблеме

UITableViewCell *cell;

if (indexPath.section == 0) {
    cell = [tableView dequeueReusableCellWithIdentifier:@"CellWithoutSubview"];
    if (cell ==nil ) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewStylePlain reuseIdentifier:@"CellWithoutSubview"] autorelease];
    }

    //do stuff with cell like set text or whatever
}
else if (indexPath.section == 1) {
    cell = [tableView dequeueReusableCellWithIdentifier:@"CellWithSubview"];
    if (cell ==nil ) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewStylePlain reuseIdentifier:@"CellWithSubview"] autorelease];

        d = [[UIView alloc] init];
        [cell.contentView addSubview:d];
        [d release];
    }


}

return cell;

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

1 голос
/ 14 сентября 2011

Вы должны использовать dequeueReusableCellWithIdentifier. Цель dequeueReusableCellWithIdentifier - использовать меньше памяти. Если экран может вместить 4 или 5 ячеек таблицы, то при повторном использовании вам нужно только выделить 4 или 5 ячеек таблицы в памяти, даже если таблица имеет 1000 записей.

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

UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier: @"your-id"];
if (cell)
{
     //reusing old cell. reset all subviews before putting new content.
}
else
{
     //Create a fresh new cell
}
0 голосов
/ 14 сентября 2011

Вы должны использовать switch вместо:

switch ( indexPath.section )
{
    case 0:
    {
        /* do soemthing */
    }
        break;
    case 1:
    {
        d = [UIView alloc] init];
        [cell.contentView addSubview:d];
    }
        break;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...