Проблема повторного использования ячейки TableView на iPhone - PullRequest
2 голосов
/ 10 сентября 2011

У меня есть список ячеек в табличном представлении, где только у последней ячейки есть индикатор раскрытия (это вызывает действие). Когда я прокручиваю свой список ячеек, все работает нормально, но если я делаю странную прокрутку вверх, индикатор раскрытия появляется и в других ячейках. Я не могу понять, в чем проблема, любая помощь?

Спасибо, Даниэла

Это часть кода, которая используется:

static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

if (cell == nil) {

    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease];     
}
cell.textLabel.text = [myArray objectAtIndex:indexPath.row];
if(([myArray count]-1) == indexPath.row) {
    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
}

Ответы [ 3 ]

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

это не ошибка: это особенность;) потому что ячейки используются повторно.

Если ваше табличное представление содержит 200 ячеек и ваш iphone способен отображать 5 ячеек одновременно, тогда вы толькоесть 5-6 экземпляров UITableViewCell.Если вы прокручиваете ячейку вниз, она получает кнопку раскрытия, а если вы прокручиваете назад, ячейка используется повторно, и в результате кнопка раскрытия все еще остается.

для решения вашей проблемы:

подход 1: не только установить кнопку раскрытия на последней ячейке.Вы также должны удалить / сбросить его в других ячейках.

подход 2: кажется, что последняя ячейка является другим типом ячейки в семантике.Поэтому выберите идентификатор повторного использования, например: @"MyLastCell для последней ячейки и @"MyCell" для всех остальных ячеек.В результате ваше табличное представление будет повторно использовать только ячейки одного типа (в вашем случае: с / без кнопки раскрытия)

edit 1: некоторый образец-псевдокод для подхода 2; редактировать 3: более короткое решение для захода на посадку 2

    static NSString *CellIdentifier = @"Cell";
static NSString *LastCellIdentifier = @"LastCell";

bool isLastRow = (indexPath.row == numRows-1);
NSString *usedCellIdentifier = isLastRow ? LastCellIdentifier : CellIdentifier;

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier: usedCellIdentifier];

if(!cell)
{
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:usedCellIdentifier] autorelease];
    if(isLastCell)
    {
        //do disclosure-stuff here. Or add a UIButton here
        cell.accessoryType = UITableViewCellAccessoryDetailDisclosureButton
    }   
}

редактировать 2 : пример кода для захода на посадку 1

static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

if (cell == nil) {

    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease];     
}

cell.accessoryType = (idexPath.row == numRows-1) ? 
    UITableViewCellAccessoryDetailDisclosureButton 
    : UITableViewCellAccessoryNone ;
1 голос
/ 10 сентября 2011

попробуйте

static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

if (cell == nil) {

    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease];     
}
cell.textLabel.text = [myArray objectAtIndex:indexPath.row];
if(([myArray count]-1) == indexPath.row) {
    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
}
else{

    cell.accessoryType = UITableViewCellAccessoryNone;
}
1 голос
/ 10 сентября 2011

Как сказал Томас, вы можете использовать его код и добавить:

cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;

для последней ячейки (в том месте, где вы выделили последнюю ячейку), и это:

cell.accessoryType = UITableViewCellAccessoryNone;

для других ячеек (внутри, если вы удаляете другие ячейки).

Я не пробовал этот код, но он должен работать ...;)

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