Каков наилучший способ вернуть разные ячейки в зависимости от положения в UITableView - PullRequest
1 голос
/ 16 марта 2010

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

В настоящее время у меня есть большой оператор if в cellForRowAtIndexPath , где каждая ветвь создает и возвращает соответствующую настраиваемую ячейку на основе опроса свойств раздела и строки indexPath. например,

if (indexPath.section == 0 && indexPath.row == 0) {
    // instantiate and return cell A
} else if (indexPath.section == 1 && indexPath.row == 2) {
    // instantiate and return cell B
} //etc etc

Какова лучшая практика для этого сценария? Большой оператор if выполняет свою работу, но является ли он лучшей реализацией?

Ответы [ 4 ]

1 голос
/ 16 марта 2010

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

1 голос
/ 16 марта 2010

Один метод, который я использовал один или два раза, - это вложенная серия объектов NSArray, которые я инициализирую в viewDidLoad:

// sec<n>Row<n>Cell are IB Outlets to UITableViewCell objects defined in your .xib
NSArray *firstSectionRows = [[NSArray alloc] initWithObjects: sec1row1Cell, sec1row2cell, nil];
NSArray *secondSectionRows = [[NSArray alloc] initWithObjects: sec2row1Cell, sec2row2cell, nil];

// cellTree is an instance variable
cellTree = [[NSArray alloc] initWithObjects: firstSectionRows, secondSectionRows, nil];
[firstSectionRows release];
[secondSectionRows release];

Тогда ваш tableView:cellForRowAtIndexPath: метод будет выглядеть так:

...
return [[cellTree objectAtIndex:indexPath.section] objectAtIndex:indexPath.row];
...

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

Если у вас большая или сложная структура, вы можете выполнить настройку массива в файле .plist и использовать метод initWithContentsOfFile: NSArray, чтобы прочитать его. Однако вам понадобится какое-то волшебство KVC, чтобы получить объекты ячеек из строк в вашем массиве:

return [self valueForKey:[[cellTree objectAtIndex:indexPath.section] objectAtIndex:indexPath.row]];
1 голос
/ 16 марта 2010

В сложных табличных представлениях я рассмотрел разделение подпрограмм UITableViewDataSource на под-делегаты, по одному делегату для каждого раздела. Таким образом, для 3 разделов я бы создал 3 отдельных объекта, каждый из которых отвечает за предоставление методов UITableViewDataSource для этого раздела таблицы. Затем делегат UITableView просто отправляет одному из соответствующих суб-делегатов в зависимости от того, для какого раздела предназначен запрос.

0 голосов
/ 16 марта 2010

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

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