Изменение последовательности в iOS 5 в UITableView — viewForHeaderInSection и heightForHeaderInSection переключено

#uitableview #ios5

#uitableview #ios5

Вопрос:

О, горе мне — iOS 5 сломала мое приложение.

У меня есть UITableView, и до iOS 5 делегаты вызывались в последовательности

  1. viewForHeaderInSection (что позволило мне динамически создавать мой вид заголовка)
  2. heightForHeaderInSection (что позволило мне указать скорректированную высоту заголовка

Я только что проверил и запустил программу в симуляторе iOS 4.3 и симуляторе iOS 5.0 (и устройстве iOS 5), и точно такой же код вызывается в обратной последовательности в iOS5. ПОЧЕМУ!!!!

Состояние документов (для TableView: heightForHeadInSection 🙂

«Особые соображения

До iOS 5.0 табличные представления автоматически изменяли высоту заголовков до 0 для разделов, где TableView:viewForHeaderInSection: возвращал нулевое представление. В iOS 5.0 и более поздних версиях вы должны возвращать фактическую высоту для каждого заголовка раздела в этом методе.»

Нигде не указано, что они незаметно изменили последовательность вызовов.

Мой вопрос: Кто-нибудь сталкивался с этим и какие-либо предложения по решению этой проблемы? Мне все перекодировать? Мне нужно иметь заголовок переменной высоты, высоту которого я могу определить только после создания headerView.

Ответ №1:

да, я наблюдаю такое же поведение. Вы создаете представление заголовка в tableView:heightForHeadInSection и повторно используете его в viewForHeaderInsection вместо того, чтобы создавать его дважды.

До версии 5.0 вы должны были сделать аналогичную вещь для heightForRowAtIndexPath и cellForRowAtIndexPath , если высота известна, только после построения представления.

Ответ №2:

Просто добавьте что-то вроде этого, чтобы исправить это:

// iOS 5 и более поздние версии по-прежнему ожидают высоту при возврате nil

-(CGFloat)TableView: (UITableView *) Раздел TableView heightForHeaderInSection:(NSInteger) {

 // Do some check on if this section has a header
if ([navigationSections_[section] hasHeader]) {
    return 0;
} else {
    // This will use the default height
    return tableView.sectionHeaderHeight;
}
  

}