2013-10-11 3 views
2

Я создал пользовательский XIB-файл с UIView, который я хотел бы отобразить в виде UITableView в виде заголовка в разделе. Я правильно реализовать необходимые методы делегата, а конечно:UITableView Sectionheader, загруженный из XIB, иногда отображается неправильно

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection: 
    (NSInteger)section 
{ 
    if (tableView == self.messageTableView) { 
     TableViewHeaderView *header = [[[NSBundle mainBundle] 
     loadNibNamed:@"TableViewHeaderView" owner:self options:nil] lastObject]; 

     [header.titleLabel setText:@"A String"]; 
     [header.addressLabel setText:@"Another String"]; 

     [header sizeToFit]; //I tried it with and without this line, 
          // does not seem to help 
     return header; 
    } 
    return nil; 
} 

Того самый TableViewHeaderView класса является подклассом UIView.

Все, казалось, работает достаточно хорошо, я действительно использовал этот подход в некоторых других проектах, и все, казалось, хорошо работало. Тем не менее, я столкнулся с довольно странной и случайной ошибкой. Запуск приложения и игра с данными Tableview, некоторые разделы Headheader-Views иногда отображаются неправильно, как на следующем экране. Из-за моей новой учетной записи на этом форуме я не могу вставить картинку прямо в этот пост. Но вы можете использовать ссылку вместо (извините за это):

http://i.stack.imgur.com/JSeVz.png

UITableView имеет восемь разделов в этом примере. Поскольку вы можете четко видеть, что разделы заголовка «Отправка 3,4,5» полностью утеряны. Они застряли на своем месте и двигаются вместе при прокрутке стола. Однако при прокрутке вниз по таблице они появятся во второй раз в правильном месте.

К слову: я не использую AutoLayout в этом проекте, представление имеет правильную высоту, соответствующую методу делегата , и такую ​​же ширину, что и базовое табличное представление. Autosizing из HeaderView, а также основной UITableView установлен в:

http://i.stack.imgur.com/Ms0ZC.png

Перезагрузка TableView не помогает.

У кого-нибудь есть идея, что там не так? У меня нет ни малейшего понятия. Или это подход использования пользовательских представлений вроде старых?

Благодарим за помощь!

+0

Я попытался бы установить точку останова в этом методе делегата и проверить фрейм этого заголовка. –

+0

Хорошо, я попробую, но, как уже упоминалось, ошибка происходит довольно случайным образом. Возможно немного – croX

ответ

0

Я думаю, что понял, это довольно индивидуальная ошибка.

Ошибка при возникновении ошибки при вызове метода reloadSections:withRowAnimation: для соответствующего объекта UITableView. Использование reloadData решило проблему.

Ошибка сама по себе трудно объяснить, поскольку это будет означать значительную часть реализации соответствующих приложений. В любом случае, я думаю, что это вызвано выполнением большого количества последовательных ошибок reloadSections:withRowAnimation: с reloadData Вызов метода за короткий период времени. Мое приложение имеет несколько асинхронных вызовов метода reloadSections:withRowAnimation:, когда новые данные принимаются через UDP-Socket, и в то же время пользователь выполняет перезагрузку таблицы вручную (при использовании фильтра в представлении таблицы - кнопки внизу представления используются для этого), это может фактически вызвать проблему.

Я думаю, что некоторые из уже созданных объектов заголовка Headheader могут не очиститься, чтобы они оставались в супервизии. Я не уверен, является ли это правильным объяснением, но проблема исправлена ​​по крайней мере :)

Смежные вопросы