2010-06-17 3 views
0

У меня есть UItableview с ячейками. Некоторые ячейки имеют uilabels, а некоторые имеют uibuttons. UI-кнопки создаются всякий раз, когда первый символ в массиве «^». Тем не менее, uibuttons повторяются, когда я прокручиваю вниз (появляется над uilabel) .. и затем размножаюсь по uilabels при прокрутке вверх. Какие-нибудь подсказки почему?UITableViewCell повторяющаяся проблема

ответ

5

Actaully каждый раз, когда раздел прокручивается и строки загружаются, все ярлыки и компоненты ui добавляются в ячейку во время выполнения, вам нужно очистить все виды, которые добавлены в ячейку, каждый раз, когда ваша ячейка и из очереди не ноль, смотрите следующий пример:

static NSString *CellIdentifier; 

    CellIdentifier = [NSString stringWithFormat:@"Cell%d%d",indexPath.section,indexPath.row]; 

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 
/* 
* THIS IS FOR OS VERSION 2.2 THE OLDER VERSION 
*  cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease]; 
*/ 

    } else { 
     for (UIView* tempView in cell.contentView.subviews) { 
      [tempView removeFromSuperview]; 
     } 
    } 
+0

Я использовал метод iAnsari и поместил код создания метки и кнопки после цикла tempView removeFromSuperview и, похоже, работает. Возможно, это не лучший способ. – cannyboy

2

Содержимое ячейки не должно быть установлено внутри if (cell == nil). Должна быть определена только структура (макет). Содержание должно быть установлено после проверки:

CellIdentifier = @"TableCell"; 

cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

if (cell == nil) { 
     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 

     // setup everything that's the same for every cell 
     // (e.g. add controls to the cell) 
} 

// setup everything that's different in each cell (set text, images, ...) 

То, что здесь происходит, что клетка быть «подготовлен» и кэшируются, так что не нужно будет заново для каждой ячейки. Если вы установите содержимое ячейки внутри if (cell == nil), вы храните содержимое ячейки в кеше.

+0

Я не уверен, какая разница между структурой и контентом, в контексте моего примера. – cannyboy

+0

«Структура» - это все то же самое для всех ячеек. «контент» - это то, что меняется в каждой ячейке. –

+0

Извините, я до сих пор не могу понять это в контексте моего примера. – cannyboy

2

UITableView не сохраняет одну UITableViewCell для каждой логической строки. Он сохраняет только количество ячеек, необходимых для отображения строк, находящихся на экране. На практике это означает, что в каждый момент времени существуют только ячейки высоты по умолчанию 9-11.

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

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

Для устранения неполадок необходимо удалить кнопку, если вы хотите отобразить метку, и удалить ярлык, если хотите отобразить кнопку.

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

+0

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

+0

Затем вы должны нажать галочку рядом с ответом iAnsari. – TechZen

1

Вы используете многоразовые ячейки, поэтому в cellForRowAtIndexPath: вам нужно проверить - есть ли в ячейке кнопка или ярлык? Если это так, удалите их, добавьте-init новый и добавьте его как subview. Для этого используйте теги, это очень удобно.

Смежные вопросы