Что делать, если каждая ячейка в UITableView уникальна? - PullRequest
0 голосов
/ 11 марта 2012

У меня есть UITableView, где каждая ячейка уникальна по содержанию, но похожа на цель и не знаю, как сделать ячейки. Смотрите следующее изображение.
Example Image
Контур черного ящика представляет собой таблицу, которая разделена на строки. Каждая строка имеет переменную высоту и содержит визуальное представление различных данных.
У меня около 50 строк, каждая строка содержит около 10 из тех зеленых / синих линий, которые существуют из 2UIViews и UILabel. Я не нуждаюсь в редактировании или удалении. Данные составляют около ± 30 КБ JSON, который я преобразую в строго типизированные объекты.


На данный момент я определил следующие подходы:

  1. Нет удаления из очереди, сохраняя каждую ячейку, созданную с соответствующими данными.
  2. Нет удаления из очереди, не сохранение ячейки, а инициализация и полное восстановление визуального представления по данным.

    Снятие очереди всегда лучше.

  3. Удаление очереди из ячейки через уникальные идентификаторы и создание ее в противном случае
    • Можно ли это сделать с помощью уникальных идентификаторов, или мне придется реализовать это самостоятельно?
  4. Отмена очереди ячейки и полное восстановление визуального представления по данным.

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

Какой подход лучше всего подходит и считается приемлемым? Или почему другой подход был бы лучше?

Ответы [ 2 ]

3 голосов
/ 11 марта 2012

Если количество строк

  1. исправлено
  2. количество строк очень мало (объем памяти)

и каждый ряд довольно не связан, Quick Way ™ должен был бы предварительно инициализировать все ячейки и возвращать их по мере необходимости:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    return [myCells objectAtIndex:indexPath.row];
}

Однако, если есть небольшая вероятность того, что все ваши ячейки не поместятся в память сразу (запомните все фоновые вещи, которые также увеличивают ваше общее доступное пространство кучи в 22-25 МБ), вам все равно следует подумать о том, чтобы Более подробный способ и лениво создавать ячейки при первом обращении к ним, а затем кешировать результат. Хорошей новостью является то, что UITableView уже делает именно это для вас, просто используйте идентификаторы ячеек, как и предполагалось.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    NSString *identifier = [NSString stringWithFormat:@"MyCell%d", indexPath.row];
    MyTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];
    if (cell == nil) {
       cell = [[MyTableViewCell alloc] initWithCellIdentifier:identifier];
       [cell autorelease]; // if non-ARC
    }
    return cell;
}

Я не рекомендую использовать нулевой идентификатор, как предлагает rocir. Предоставляя идентификатор ячейки nil, вы не позволяете UTTableViewController кэшировать ячейку для вас ( документация ). Это создает дополнительные издержки, когда ваша ячейка прокручивается из видимой области и снова становится видимой на более позднем этапе, когда пользователь прокручивает назад. В этом случае ячейка все еще может быть рядом, но у вас нет возможности получить к ней доступ при вызове tableView: cellForRowAtIndexPath:.

1 голос
/ 11 марта 2012

Иногда повторное использование ячейки может вызвать некоторые проблемы, если каждая из них уникальна.Это зависит от случая, и я не уверен, как вы это реализуете.То, что я сделал, не вызывая проблем с производительностью, это передавал nil в идентификаторе и каждый раз создавал ячейку.

UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil];

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

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