2015-07-06 5 views
-1

Я использую UITableView с различными типами ячеек, определенными в раскадровке. Стили - это все «Субтитры». Для одного типа клеток, то идентификатор является «метка», он используется в моей таблице в двух местах, и принес таким образом:UITableViewCell blank при повторном использовании

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"label" forIndexPath:indexPath]; 

Код для заполнения текстовых меток:

// cell {0,0} {section,row} 
cell.textLabel.text = @""; 
cell.detailTextLabel.text = @"Subtitle 1"; 
NSLog(@"%@",cell); // <UITableViewCell: 0x13ee183c0; frame = (0 26; 320 52); text = ''; ... 

И

// cell {6,0} 
cell.textLabel.text = @"Version"; 
cell.detailTextLabel.text = @""; // using @" " instead cures the problem 
NSLog(@"%@",cell); // <UITableViewCell: 0x13ee183c0; frame = (0 1022; 320 52); text = 'Version'; ... 

При запуске ячейка {0,0} показывает правильный текст. Когда я прокручиваю вниз, ячейка {6,0} показывает правильный текст. Но, когда я прокручиваю назад вверх, ячейка {0,0} пуста (повторное использование cell.text = 'Version'). Если я прокручиваю ячейку {0,0} вне поля зрения, затем прокрутите ее назад, ячейка {0,0} в порядке (повторное использование cell.text = '').

В ячейке {6,0}, если я использую @" " вместо @"" для detailTextLabel, то проблема уходит, но расстояние в ячейке неверно («Version» больше не выровнен по вертикали).

Любопытно, что cell.text (устаревшее свойство) не пусто во втором случае, но явно устанавливая cell.text обратно в ноль или @"" в {0,0} не имеет никакого значения.

Почему первая ячейка пуста при повторном использовании в разделе 6?

отредактирован ADD:

Вот упрощенная версия моего кода, который по-прежнему демонстрирует проблему.

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 
{ 
    return 10; 
} 
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    return 2; 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    NSString *resueIdentifier; 
    if (indexPath.section == 0 && indexPath.row == 0) { 
     resueIdentifier = @"label"; // in the nib, this is a cell with no other controls 
    } else if (indexPath.section == 6 && indexPath.row == 0) { 
     resueIdentifier = @"label"; 
    } else { // all other rows for demo contain a UISwitch 
     resueIdentifier = @"switch"; // in the nib, this is a cell with a UISwitch (e.g., Settings) 
    } 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:resueIdentifier forIndexPath:indexPath]; 
    // never nil -- that always returns a cell from the storyboard/nib 

    if (indexPath.section == 0 && indexPath.row == 0) { 
     cell.textLabel.text = @""; // no title 
     cell.detailTextLabel.text = @"This is detail text"; 
    } else if (indexPath.section == 6 && indexPath.row == 0) { 
     cell.textLabel.text = @"Version X"; 
     cell.detailTextLabel.text = @""; // no detail text (this causes the problem) 
    } else { 
     cell.textLabel.text = @"X"; 
     cell.detailTextLabel.text = @"Y"; 
    } 
    return cell; 
} 

Чтобы увидеть проблему, перейдите к разделу 6 (см «Version X» в ячейке), а затем вернитесь к вершине. Верхняя строка будет пустой (должен отображать «Это подробный текст»). Затем прокрутите вниз, так что строка 0 не отображается, затем прокрутите страницу назад (строка 0 отобразит текст детали).

Вот пример из моей Раскадровки (строка "метки" выбрана): Storyboard

+0

Paste во всем коде cellForRowAtIndexPath – Shai

+0

Не видя весь метод, трудно сказать, где дела идут не так, - но от того, что вы положили здесь мне хочется спросить, если это необходимо использовать динамические ячейки, если вы ожидаете статический контент в определенном месте? Вы можете захотеть рассмотреть статические ячейки, если у вас есть явный контент. –

+0

@Shai: Я добавил еще код. – Jeff

ответ

0

Решения: добавить [cell layoutIfNeeded] в конце tableView:cellForRowAtIndexPath: (Возможно, это ошибка Apple при использовании раскадровки с различными типами прототипов?)

Предложил https://stackoverflow.com/a/27699358/236415

+0

Да, это ошибка iOS8, исправленная в iOS9. См. Http://stackoverflow.com/questions/25793074/subtitles-of-uitableviewcell-wont-update. –

0

Пожалуйста, используйте это:

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

    if (cell == nil) 
    { 
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; 
     NSLog(@"new one"); 
    } 

Надеется, что это может помочь/

+0

При использовании раскадровки с ячейками прототипа dequeueReusableCellWithIdentifier: forIndexPath: никогда не возвращает нуль. – Jeff