textLabel в UITableViewHeaderFooterView больше не доступен в iOS8?

-(void)tableView:(UITableView *)tableView willDisplayHeaderView:(UIView *)view forSection:(NSInteger)section{
    UITableViewHeaderFooterView *headerIndexText = (UITableViewHeaderFooterView *)view;
    [headerIndexText.textLabel setTextColor:[UIColor whiteColor]];
}

Приведенный выше код отлично работает на iOS6 и iOS7 и уже некоторое время находится в разработке. Однако при работе на iOS8 в симуляторе iPhone5S приложение аварийно завершает работу со следующей ошибкой:

-[UIView textLabel]: нераспознанный селектор отправлен экземпляру 0xeccad20.

Является ли это устаревшим подходом к стилизации этой метки или это ошибка в iOS8?


person StevenOjo    schedule 04.06.2014    source источник
comment
API для этого класса не изменился, так что это не так. Обычно я бы сказал, что это проблема с вашим кодом (где кажется, что представление заголовка на самом деле просто UIView, а не UITableViewHeaderFooterView), но если это определенно работает в более ранних версиях, то я подозреваю, что это ошибка iOS 8.   -  person Dima    schedule 04.06.2014
comment
@StevenOjo: я использовал тот же метод в своем приложении (сборка с Xcode6 GM - iOS8 SDK) и запускал его на iPhone5 с iOS8 GM, и он работал нормально, без сбоев. Пожалуйста, попробуйте запустить на реальном устройстве, проблема может быть связана с симулятором.   -  person Rigel Networks    schedule 18.09.2014
comment
Та же проблема в моем приложении. Смотрите ответ ниже!   -  person RobP    schedule 18.09.2014


Ответы (1)


Я была такая же проблема. В предыдущих версиях iOS, если у вас было собственное представление заголовка, ваш делегат не вызывался с willDisplayHeaderView:forSection: для разделов с вашим пользовательским представлением, и приведение типов было безопасным. Теперь, видимо, они будут звонить вам для каждого заголовка, даже для ваших пользовательских. Таким образом, параметр view может быть вашим пользовательским UIControl, а не фактическим UITableViewHeaderFooterView. Чтобы отфильтровать новые вызовы iOS8 вашему делегату, защитите его следующим образом:

-(void)tableView:(UITableView *)tableView willDisplayHeaderView:(UIView *)view forSection:(NSInteger)section{
     if([view isKindOfClass:[UITableViewHeaderFooterView class]]) {
        UITableViewHeaderFooterView *headerIndexText = (UITableViewHeaderFooterView *)view;
        [headerIndexText.textLabel setTextColor:[UIColor whiteColor]];
    } else {
        NSLog(@"This is the new iOS case where the delegate gets called on a custom view.");
    }
}
person RobP    schedule 18.09.2014