Как я могу использовать загруженный NIB UIView в tableView viewForHeaderInSection без снижения производительности - PullRequest
2 голосов
/ 21 марта 2009

Я реализую tableView viewForHeaderInSection, где я возвращаю загруженный кончик UITableViewCell.

Я упростил это для целей этого вопроса.

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
    UIView* header = [CellFactoryController newSectionHeader];
    header.text = "Some Text Depending on the section"
    return header;

}

К сожалению, это очень медленно, потому что у меня иногда есть 50+ заголовков, которые все загружаются из nib одновременно, когда таблица рисует, даже если эти заголовки не отображаются.

Есть ли у меня какой-то реалистичный способ клонировать UIViews и, таким образом, клонировать заголовок в этом примере? Или это единственный способ для меня просто создать жестко закодированные заголовки UIView?

Спасибо

Ответы [ 3 ]

1 голос
/ 01 февраля 2011

Однажды вечером я читал документацию по классу UINib и говорил о том, как он кэширует внутреннюю структуру nibs, поэтому повторяющиеся запросы выполняются быстрее. Это может быть подходящим вариантом для вас.

1 голос
/ 01 февраля 2011

Ну, я не знаю, нужен ли вам еще ответ на этот вопрос, но ... какого черта. Давай сделаем это. Я собираюсь сделать некоторые предположения, но если у вас проблемы с производительностью, единственный способ действительно решить эту проблему - это протестировать ее, и без большего знания сложности ваших представлений мы не сможем получить надежные показатели. , Поэтому я собираюсь предположить, что вы попробовали несколько вещей и выбросить что-то, чего вы, возможно, не пробовали.

Когда вы загружаете представление из пера, оно разархивирует его из файла. Если эта загрузка происходит 50 раз, это может иметь большое значение для проблем с производительностью. Так что еще мы можем сделать? Итак, в вашем классе контроллера табличного представления создайте новую переменную экземпляра типа NSData. Затем в вашем методе -init (или другом назначенном инициализаторе) загрузите представление из списка свойств:

- (id)init
{
    self = [super init];

    if (self) {
        // Other initialization code.

        NSString *filePath = [[NSBundle mainBundle] pathForResource:@"MyView"
                                                             ofType:@"plist"];
        myData = [[NSData alloc] initWithContentsOfFile:filePath];
    }

    return self;
}

ОК, значит, этот список свойств загружен в NSData. Теперь остальное должно быть понятно:

- (UIView *)tableView:(UITableView *)tableView
viewForHeaderInSection:(NSInteger)section 
{
    UIView *view = [NSKeyedUnarchiver unarchiveObjectWithData:myData];

    return view;
}

Моя цель состояла в том, чтобы сохранить в памяти полностью инстанцированный вид. Но потом я подумал: «Как он собирается создать этот список?» Поэтому я немного изменил его. Вместо загрузки данных из файла создайте свое представление в коде:

- (UIView *)tableView:(UITableView *)tableView
viewForHeaderInSection:(NSInteger)section 
{
    UIView *headerView;

    if (myData == nil) {
        headerView = [[UIView alloc] init];
        // Configure your view, but only that part that isn’t customized.

        myData = [[NSKeyedArchiver archivedDataWithRootObject:headerView] copy];
    } else {
        headerView = [NSKeyedArchiver unarchiveObjectWithData:myData];
    }

    // Now customize the view for your particular section.

    return headerView;
}

Это должно дать вам гибкость при создании представления в коде, но, надеюсь, также сохранить его в памяти и кешировать для вас. Попробуйте!

0 голосов
/ 01 февраля 2011

Возможно, вы могли бы разбить ваши представления на отдельные файлы .xib для ускорения загрузки, но (как вы сказали), вероятно, лучше всего будет создать эти представления процедурно. Вне примера быстрого кода файлы .xib обычно зарезервированы для очень высокоуровневой компоновки контейнеров, необходимых для всего приложения или для полноэкранного просмотра. Макет и отрисовка элементов, ориентированных на детали, таких как ячейки, верхние и нижние колонтитулы в табличных представлениях, обычно лучше обрабатываются процедурно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...