Где разместить логику обновления для пользовательского UITableViewCell? (IPhone) - PullRequest
1 голос
/ 15 ноября 2009

У меня просто быстрый вопрос с рекомендациями относительно пользовательских ячеек в UITableView. Моя проблема возникает при создании пользовательской ячейки в блоке if (cell == nil) в

- (UITableViewCell *)tableView:(UITableView *)theTableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

(1) Если я создаю метки и устанавливаю их текстовое свойство внутри блока (cell == nil); только ячейки, видимые на экране, будут содержать правильный текст, остальные просто будут использованы повторно.

(2) Хорошо, поэтому я пытаюсь переместить здание пользовательской ячейки за пределы блока. Это, конечно, приводит к тому, что мои ячейки перерисовываются снова и снова каждый раз, когда пользователь прокручивает… и друг над другом.

(3) Я также попытался поместить чертеж пользовательской ячейки (метки, графику и т. Д.) В блок (cell == nil), но установил свойство label.text после блока. Это не может быть сделано как мой UILabels тогда не может быть доступен извне блока, в котором они были созданы. Я мог бы сойти с ума (UILabel * l в cell.contentView.subviews), но для этого потребовался бы оператор if для каждой метки и, возможно, некоторые теги для их идентификации. с.

(4) Затем я мог бы объявить все свои метки перед блоком (cell == nil), а затем просто создать экземпляр и нарисовать внутри блока и установить свойство text после блока (cell == nil). Но когда я прошел 10 UIlabels, это выглядит и выглядит очень грязно, так как они растекаются внутри и снаружи блока (cell == nil), плюс они будут объявляться каждый раз, когда таблица должна «обновляться».

Причина, по которой я спрашиваю, заключается в том, что при использовании 2-4 меток я всегда находил способ обойти это, но на этот раз мне нужно настроить 12 пользовательских UILabels, и я хотел бы сделать это так, чтобы мне пришлось перерисовывать наименьшее количество графики, так как, вероятно, будет много ячеек.

Я видел примеры, когда люди и документы Apple используют:

- (void) configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath {

Но я не могу понять, как это могло бы мне помочь:)

Надеюсь, кто-то может указать на "лучшую практику" для такого рода вещей.

Спасибо!

1 Ответ

3 голосов
/ 15 ноября 2009

Ваш вариант 3 - это путь. Создайте ячейку со всеми ее подвидами всякий раз, когда требуется новая ячейка (т. Е. В блоке if (cell == nil)), и установите содержимое ваших меток после блока.

Если вы используете пользовательский подкласс UITableViewCell, вы можете объявить свойство для каждой метки, а затем получить к ним доступ с помощью cell.myLabelX вне блока. Если нет, я бы использовал свойство tag для установления соединения. При создании ячейки присвойте каждому тегу уникальный тег:

UILabel *label1 = [[UILabel alloc] initWithFrame:...];
label1.tag = MYLABEL1TAG;
[cell addSubview:label1];
...

Вне блока найдите метки через их теги:

UILabel *label1 = (UILabel *)[cell viewWithTag:MYLABEL1TAG];
label.text = ...

Это также, как Apple делает это во многих местах в своем примере кода (по крайней мере, так они делали, когда я последний раз выглядел).

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