Заголовок раздела UITableView, загруженный из XIB, иногда отображается неправильно

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

- (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, некоторые представления Sectionheader-View иногда отображаются неправильно, как на следующем экране. Из-за моей новой учетной записи на этом форуме я не могу вставить изображение прямо в это сообщение. Но вместо этого вы можете использовать ссылку (извините за это):

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

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

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

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

Перезагрузка таблицы тоже не помогает.

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

Спасибо за вашу помощь!


person croX    schedule 11.10.2013    source источник
comment
Я бы попытался поставить точку останова в этом методе делегата и проверить кадр этого представления заголовка.   -  person Enrico Susatyo    schedule 12.10.2013
comment
Хорошо, я попробую, но, как уже упоминалось, ошибка возникает совершенно случайно. Может стать немного обширным   -  person croX    schedule 12.10.2013


Ответы (1)


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

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

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

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

person croX    schedule 14.10.2013