2015-05-13 2 views
0

У меня возникла проблема с повторным использованием нескольких пользовательских UITableViewCell. У меня есть 3 типа пользовательских UITableViewCell. Я попытался повторно использовать UITableViewCell, используя dequeueReusableCellWithIdentifier.Повторное использование UITableViewCell без повторения данных

Я написал prepareForReuse и сделал все возможные данные в виде представлений nil. Но все же я получал некоторые повторения данных в некоторых UITableViewCell. Поэтому я думал о повторном использовании xib без каких-либо данных.

Я составил следующий код. У приложения теперь есть проблема с замораживанием. Кто-нибудь, пожалуйста, покажет мне правильный способ повторного использования tableview UITableViewCells без повторения данных.

static NSString *cellIdentifier = @"SystemListCell"; 

IXSystemMessageCustomCell *cell = (IXSystemMessageCustomCell *)[tableView dequeueReusableCellWithIdentifier:cellIdentifier]; 

if (cell == nil) { 
     cell = [[[NSBundle mainBundle] loadNibNamed:@"IXSystemMessageCustomCell" owner:self options:nil] objectAtIndex:0]; 
     cell.selectionStyle = UITableViewCellSelectionStyleNone; 
} 
IXSystemMessageCustomCell *cellToSave = cell; 
[self configureSystemCell: cellToSave atIndexPath:indexPath]; 
return cellToSave; 
+0

Вы имели в виду, что у вас есть 3 типа ячеек, и они появляются не так, как вам нужно, или повторяются только данные внутри ячейки? – abhi1992

+0

Данные в ячейке повторяются. Обратите внимание, что я использую xibs для создания пользовательских ячеек. – Rounak

+0

вам нужно использовать разные идентификаторы, если у вас 3 разных расположения ячеек. –

ответ

0

Не изменять данные в prepareForReuse

Лучший способ заключается в

dequeueReusableCellWithIdentifier:cellIdentifier forIndexPath:indexPath 

Мы всегда должны изменить данные в cellForRowAtIndexPath, так как это помогает в повторном использовании клеток.

Кроме того, поскольку вы создали IXSystemMessageCustomCell класс, лучше использовать это:

[[IXSystemMessageCustomCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] 

и писать код установки в initWithStyle:reuseIdentifier:

вместо этого:

cell = [[[NSBundle mainBundle] loadNibNamed:@"IXSystemMessageCustomCell" owner:self options:nil] objectAtIndex:0]; 
     cell.selectionStyle = UITableViewCellSelectionStyleNone; 

Ура!

0

Вы можете использовать 3 различных идентификатора повторного использования для 3-х типов клеток:

IXSystemMessageCustomCell *cell; 
if (some condintion) { 
    cell = (IXSystemMessageCustomCell *)[tableView dequeueReusableCellWithIdentifier:"CellReuseIdentifierType1"]; 
} else if (some condition 2) { 
    cell = (IXSystemMessageCustomCell *)[tableView dequeueReusableCellWithIdentifier:"CellReuseIdentifierType2"]; 
} else { 
    cell = (IXSystemMessageCustomCell *)[tableView dequeueReusableCellWithIdentifier:"CellReuseIdentifierType3"]; 
} 

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

0

Попробуйте это. ..

IXSystemMessageCustomCell *cell = nil; 
cell = (IXSystemMessageCustomCell *)[tableView dequeueReusableCellWithIdentifier:cellIdentifier]; 

Установив первую ячейку в ячейку, вы очищаете предыдущие данные, связанные с повторно используемой ячейкой.

Также зарегистрируйте свой nib один раз в вашем viewDidLoad или аналогичном методе жизненного цикла таблицы, чтобы это не требовалось при каждом вызове tableView:cellForRowAtIndexPath.

Так извлечь статический вызов из любого способа быть частной декларации ...

static NSString *cellIdentifier = @"SystemListCell"; 

и корректировать свои методы для чтения ...

- (void)viewDidLoad { 
    UINib *nib = [UINib nibWithNibName:@"IXSystemMessageCustomCell" bundle:nil]; 
    [<<self.tableView>> registerNib:nib 
      forCellReuseIdentifier:cellIdentifier]; 

    << ... other code ... >> 

} 

и

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

    IXSystemMessageCustomCell *cell = nil; 

    cell = (IXSystemMessageCustomCell *)[tableView dequeueReusableCellWithIdentifier:cellIdentifier]; 

    cell.selectionStyle = UITableViewCellSelectionStyleNone; 

    [self configureSystemCell:cell atIndexPath:indexPath]; 

    return cell; 
} 
Смежные вопросы