iOS 8: UITableViewCell подробный текст не корректно обновляется

tl; dr: Могу ли я сделать так, чтобы размер detailTextLabel обновлялся системой автоматической разметки в iOS при изменении значения?

У кого-нибудь еще были проблемы с меткой 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 относительно текстовой метки.

Ответы на вопрос(8)

Ваш ответ на вопрос