2012-06-09 3 views
0
извлечение из

У меня есть UITableView с 3 пользовательских UITableViewCells, что я в настоящее время, так как извлечение из очереди:пользовательских UITableViewCell не правильно

if (indexPath.row == 0) { 
     static NSString *CellIdentifier = @"MyCell1"; 
     MyCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
     if (cell == nil) { 
      cell = [[[MyCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 
     } 
     return cell; 
    } 
    if (indexPath.row == 1) { 
     static NSString *CellIdentifier = @"MyCell2"; 
     MyCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
     if (cell == nil) { 
      cell = [[[MyCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 
     } 
     return cell; 
    } 
    if (indexPath.row == 2) { 
     static NSString *CellIdentifier = @"MyCell3"; 
     MyCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
     if (cell == nil) { 
      cell = [[[MyCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 
     } 
     return cell; 
    } 

Я пытался сделать это несколько способов, но проблема в том, даже если я m все еще деактивирует их все с разными идентификаторами, когда я просматриваю таблицуView вокруг, иногда моя первая ячейка появляется в местоположении моей третьей ячейки и наоборот. Кажется, происходит какое-то странное кэширование.

Кто-нибудь знает, почему? Благодарю.

+0

Что делать, если вы удалите «статический» из объявления идентификатора ячейки? –

+0

Это не имеет значения. В документации Apple даже они используют статический NSString * CellIdentifier. – VTS12

+0

Вы действительно должны иметь три разные идентификационные переменные, поскольку у вас есть три разных значения. Статика только инициализируется один раз. Нигде я этот код, кажется, на самом деле не помещает какую-либо информацию в ячейки, где вы это делаете? Можете ли вы включить скриншот проблемы? И действительно ли есть только три ряда? – jrturton

ответ

1

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

Так измените код на:

static NSString *CellIdentifier = @"MyCell"; 
MyCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
if (cell == nil) { 
    cell = [[[MyCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 
} 
return cell; 

и настроить содержимое ячейки должным образом в willDisplayCell на основе indexPath.section и indexPath.row:

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath 
+0

so in willDisplayCell: forRowAtIndexPath: Мне нужно изменить/установить такие вещи, как пользовательские метки ячеек, редактировать пользовательские поля текстовых полей и т. Д.? Я думал, что согласно документам Apple, вы должны сделать это, извлекая представление для тегов subview? – VTS12

+0

Если вы собираетесь создавать уникальные subviews, сделайте это в cellForRowAtIndexPath, а затем настройте значения в willDisplayCell. В коде, который вы опубликовали, все ваши UITableViewCells были практически идентичны, без уникальных представлений, поэтому не было необходимости в трех идентификаторах. Обычно я создаю метод fillCellWithData и вызываю его как из cellForIndexPath, так и из willDisplayCell. – EricS

+0

Подумайте о cellForIndexPath как о том, что создает представления или находит неиспользуемый, который уже существует, и willDisplayCell как другой раз, когда вы должны заполнить его данными. – EricS