Загрузка многоразового UITableViewCell из пера - PullRequest
89 голосов
/ 05 января 2009

Я могу спроектировать пользовательские UITableViewCells и просто загрузить их, используя технику, описанную в потоке, найденном в http://forums.macrumors.com/showthread.php?t=545061. Однако использование этого метода больше не позволяет инициировать ячейку с помощью reuseIdentifier, что означает, что у вас есть создавать совершенно новые экземпляры каждой ячейки при каждом вызове. Кто-нибудь нашел хороший способ все еще кэшировать определенные типы ячеек для повторного использования, но все еще быть в состоянии проектировать их в Интерфейсном Разработчике?

Ответы [ 16 ]

2 голосов
/ 22 января 2010

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

Подход [nib objectAt...] подвержен изменениям позиций элементов в массиве.

Подход UIViewController хорош - только что попробовал, и он работает достаточно хорошо.

НО ...

Во всех случаях конструктор initWithStyle НЕ вызывается, поэтому инициализация по умолчанию не производится.

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

Помимо явного вызова некоторого метода инициализации в методе cellForRowAtIndexPath, я пока не нашел ответа на этот вопрос.

2 голосов
/ 10 февраля 2009

Метод Луи работал на меня. Вот код, который я использую для создания UITableViewCell из пера:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{   
    UITableViewCell *cell = (UITableViewCell *)[tableView dequeueReusableCellWithIdentifier:@"CustomCellId"];

    if (cell == nil) 
    {
        UIViewController *c = [[UIViewController alloc] initWithNibName:@"CustomCell" bundle:nil];
        cell = (PostCell *)c.view;
        [c release];
    }

    return cell;
}
1 голос
/ 04 ноября 2011

Из документов UITableView относительно dequeueWithReuseIdentifier: «Строка, идентифицирующая объект ячейки для повторного использования. По умолчанию идентификатором повторно используемой ячейки является имя класса, но вы можете изменить его на любое произвольное значение.»

Переопределять -reuseIdentifer самостоятельно рискованно. Что произойдет, если у вас есть два подкласса вашего подкласса ячеек, и вы используете оба из них в одном табличном представлении? Если они отправят вызов идентификатора повторного использования на super, вы удалите из очереди ячейку неправильного типа .............. Я думаю, вам нужно переопределить метод reuseIdentifier, но он должен вернуть замененный идентификатор строка. Или, если он не указан, он должен вернуть класс в виде строки.

1 голос
/ 08 июля 2010

Решение gustavogb у меня не работает, я попробовал:

ChainesController *c = [[ChainesController alloc] initWithNibName:@"ChainesController" bundle:nil];
[[NSBundle mainBundle] loadNibNamed:@"ChaineArticleCell" owner:c options:nil];
cell = [c.blogTableViewCell retain];
[c release];

Кажется, работает. BlogTableViewCell является IBOutlet для ячейки, а ChainesController является владельцем файла.

0 голосов
/ 23 августа 2011

Я следовал инструкциям Apple, связанным с Беном Мошером (спасибо!), Но обнаружил, что Apple пропустила важный момент. Объект, который они проектируют в IB, является просто UITableViewCell, как и переменная, которую они загружают из него. Но если вы фактически установите его как пользовательский подкласс UITableViewCell и напишите файлы кода для подкласса, вы можете написать объявления IBOutlet и методы IBAction в коде и связать их с вашими пользовательскими элементами в IB. Тогда нет необходимости использовать теги вида для доступа к этим элементам, и вы можете создать любую сумасшедшую ячейку, какую захотите. Это рай касания какао.

0 голосов
/ 05 января 2009

Во что бы то ни стало, я спросил об этом инженера iPhone на одном из технических обсуждений iPhone. Он ответил: «Да, можно использовать IB для создания ячеек. Но не надо. Пожалуйста, не надо».

...