iOS 8: UITableViewCell подробный текст не корректно обновляется
У кого-нибудь еще были проблемы с меткой detailText в UITableViewCell начиная с iOS 8?
У меня есть таблица с текстовыми и подробными строками. Первоначально подробный текст представляет собой пустую строку (@ ""). После выполнения раскадровки на экране редактирования я возвращаюсь с новым значением для подробного текста и обновляю его. Я пытаюсь перезагрузить таблицу в viewWillAppear, чтобы значение присутствовало сразу после возврата к предыдущему представлению.
Как только табличное представление снова становится видимым, ячейка таблицы сместила текстовое поле вверх, чтобы освободить место для подробного текста, но подробный текст не отображается. Текст не отображается, пока я не вернусь к экрану редактирования и не вернусь во второй раз.
Что я сделал для устранения неполадок: Выглядит так, как будто автоматическое расположение для текстовой метки детали не обновляется должным образом, как я думаю, и регистрация размера и структуры фрейма detailTextLabel подтверждает это.
Я могу принудительно обновить текст, запустив [table reloadData] в viewDidAppear, однако это оставляет мне эффект мерцания, который мне не нравится, и выглядит непрофессионально.
Изменить: Дополнительные вещи, которые я сделал: я также заставил detailTextLabel изменить свой размер, используя [cell.detailTextLabel sizeToFit]. Это приводит к его отображению, но смещению в ячейке нечетным образом. После повторного перехода на страницу редактирования, detailTextLabel фиксирует свою позицию.
Я создал простой проект в качестве репозитория github, чтобы точно показать, с чем я имею дело:
https://github.com/acidaris/ios8_table_issue
Основной код контроллера представления, который я использую, также приведен ниже.
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
[self.table reloadData];
}
- (NSInteger)tableView:(UITableView *)tableView
numberOfRowsInSection:(NSInteger)section {
return 1;
}
- (UITableViewCell *)tableView:(UITableView *)tableView
cellForRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:@"CellIdentifier"];
cell.textLabel.text = @"This is a test";
cell.detailTextLabel.text = self.value;
CGRect frame = cell.detailTextLabel.frame;
NSLog(@"detailTextLabel x=%f y=%f width=%f height=%f",
frame.origin.x,frame.origin.y,frame.size.width,frame.size.height);
return cell;
}
Ячейка прототипируется внутри StoryBoard, поэтому ячейка, выбранная dequeueReusableCellWithIdentifier: всегда определяется. Кроме того, тип ячейки в раскадровке установлен на субтитры, и он отображается, если определено начальное значение.
Если бы кто-нибудь мог помочь мне понять это, я был бы невероятно благодарен.
Частичное решениеЕсли вы подклассифицируете UITableViewCell, вы можете изменить фрейм для detailTextLabel, когда макет готов. Это то, что я сделал, и, похоже, сработало,но на 6 плюс я получаю странную разделительную линию между textLabel и detailTextLabel. edit: (я поправил это.) Мне не нравится это решение, но пока это лучшее, что я встречал. Он не обновляется после представления представления и является относительно простым. Как я уже говорил выше, я буду продолжать искать лучшее решение.
- (void)layoutSubviews {
[super layoutSubviews];
CGRect textFrame = self.textLabel.frame;
[self.detailTextLabel sizeToFit];
CGFloat x = textFrame.origin.x;
CGFloat y = textFrame.origin.y + textFrame.size.height;
CGSize detailSize = self.detailTextLabel.frame.size;
CGRect newFrame = CGRectMake(x, y, detailSize.width, detailSize.height);
self.detailTextLabel.frame = newFrame;
}
Я также обновил свой проект Github, чтобы отразить мое текущее решение. Edit3: это не работает идеально, так как оно имеет неправильные значения для действительно автоматически размещаемых кадров, но на данный момент работает для моих целей.
Редактировать 4: я обновил функцию layoutSubviews, чтобы она стала умнее. Он будет иметь размер, чтобы зафиксировать содержимое в пределах метки и правильно расположить метку в пределах координат x / y относительно текстовой метки.