Пользовательская ячейка UITableView не обновляется

Есть много вопросов об обновлении пользовательских ячеек таблицы, но этот вопрос является нечетным. У меня есть tableView с каждой ячейкой, у которой теперь есть пользовательский UILabel и UIImageView .

В настоящее время существует всего 2 ячейки. Первая показывает дату. Когда таблица сначала загружается, она отображает текущую дату как строку в первых ячейках UILabel .

Когда я выбираю первую ячейку, я представляю пользовательский класс, который обрабатывает весь выбор даты. После того, как дата была выбрана, это представление открывается, и я возвращаюсь обратно к представлению таблицы.

On -(void)viewDidAppear , данные -(void)viewDidAppear перезагружаются и должна появиться новая выбранная дата.

Однако метка в первой ячейке не обновляется.

Что смущает вопрос, что, если у меня есть несколько ячеек, отображающих одни и те же данные, все они будут обновляться и отображать новую дату, как и ожидалось. Кажется, что строка ячейки в индексе: 0 не будет обновляться.

Что еще более сбивает с толку, так это то, что когда я запрашиваю строковое значение UILabel для ячейки, он возвращает правильную дату.

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *CellIdentifier = @"Cell"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; if (cell == nil) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; // // clears the grouped style border from each table cell // UIView *clearBgView = [[UIView alloc]initWithFrame:CGRectZero]; [cell setBackgroundView:clearBgView]; // label UILabel *dl = [[UILabel alloc]initWithFrame:CGRectMake(70.0f, 10.0f, screenWidth-100, 50)]; [self setDetailsLabel:dl]; dl = nil; [[self detailsLabel] setBackgroundColor:[UIColor colorWithRed:.1 green:.1 blue:.1 alpha:.1 ]]; [[self detailsLabel] setTextColor:[UIColor colorWithRed:1.0f green:1.0f blue:1.0f alpha:.3f]]; //icon for each cell UIImageView *ci = [[UIImageView alloc]initWithFrame:CGRectMake(10.0f, 10.0f, 50.0f, 50.0f)]; [ci setBackgroundColor:[UIColor colorWithRed:.2 green:.2 blue:.2 alpha:.2]]; [self setCellIcon:ci]; ci = nil; // // set up views // [cell addSubview:[self cellIcon]]; [cell addSubview:[self detailsLabel]]; } // Configure the cell... [cell setSelectionStyle:UITableViewCellSelectionStyleNone]; //populate each by row. NSString *dateDisplay = [self formatDate:[self dateCaught]]; NSLog (@"date is %@", dateDisplay); [[self detailsLabel] setText:[self formatDate:[self dateCaught]]]; switch (indexPath.row) { //this needs to be an integer, so return the row of the indexPath. case 0: NSLog (@"text for the cell is %@",[[self detailsLabel]text]); break; default: break; } return cell; 

}

Проблема связана с тем, как вы передаете detailsLabel . Вы храните его в собственности или иваре на self

 [self setDetailsLabel:dl]; 

но вы устанавливаете его только тогда, когда ячейка недоступна для повторного использования. Когда вы повторно используете ячейку, detailsLabel on self устанавливается на метку из предыдущего запуска, вызывая всевозможные проблемы.

Самое чистое решение – создать свой собственный класс, полученный из UITableViewCell , переместить код инициализации, который создает метки, значки, цвета фона и т. Д. В назначенный инициализатор, и создать свойства для установки текстов меток. Используя этот класс, вы сможете упростить свой код следующим образом:

 UIMyCustomTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; if (cell == nil) { cell = [[UIMyCustomTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; } [cell setSelectionStyle:UITableViewCellSelectionStyleNone]; [[cell detailsLabel] setText:[self formatDate:[self dateCaught]]]; // ^--- detailsLabel can be moved to UIMyCustomTableViewCell now 

Решение состоит в том, чтобы не использовать переменную-член, такую ​​как @property detailsLabel , а вместо этого – теги для всех пользовательских подсмотров. Измените свой код следующим образом:

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *CellIdentifier = @"Cell"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; if (cell == nil) { [...] // label UILabel *dl = [[UILabel alloc]initWithFrame:...]; dl.tag = 99; [cell.contentView addSubview: dl]; [...] } [...] UILabel *dl = [cell.contentView viewWithTag: 99]; [dl setText:[self formatDate:[self dateCaught]]]; [...] return cell; } 
  • editStyleForRowAtIndexPath вызывал три раза одновременно. Зачем?
  • Таблица заполнения с ответом API Swift
  • UISlider в UITableView не отвечает на салфетку
  • Как удалить серая линия поверх UITableView
  • Установка полупрозрачного NO на UISearchBar
  • Пользовательский UITableViewCell не использует .xib (наиболее вероятно из-за ошибки в методе init)
  • iOS: отключить анимацию UITableView при появлении клавиатуры
  • UISearchDisplayController неправильно отображает пользовательские ячейки
  • UITableView не прокручивается на дно
  • Предупреждение об ограничении автоопределения «Будет пытаться восстановить, нарушая ограничение»
  • Как получить доступ к нижнему колонтитулу или заголовку определенного раздела в UITableView?
  • Interesting Posts
    Давайте будем гением компьютера.