Я использую 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 отобразит текст детали).
Вот пример из моей Раскадровки (строка "метки" выбрана):
Paste во всем коде cellForRowAtIndexPath – Shai
Не видя весь метод, трудно сказать, где дела идут не так, - но от того, что вы положили здесь мне хочется спросить, если это необходимо использовать динамические ячейки, если вы ожидаете статический контент в определенном месте? Вы можете захотеть рассмотреть статические ячейки, если у вас есть явный контент. –
@Shai: Я добавил еще код. – Jeff