我有一个分组的UITableView,它有3个部分,每个部分有许多单元格,每个单元格都需要是不同的自定义单元格,具有不同的显示要求。
我目前在 cellForRowAtIndexPath 中有一个大的if语句,每个分支实例化并根据询问indexPath的section和row属性返回相应的自定义单元格。 e.g。
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语句可以完成这项工作,但它是最好的实现吗?
答案 0 :(得分:1)
我使用过一次或两次的一种方法是我在viewDidLoad
中初始化的一系列NSArray对象:
// 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文件中进行数组设置,并使用NSArray的initWithContentsOfFile:
方法读取它。但是你必须做某种KVC魔法从数组中的字符串中获取单元格对象:
return [self valueForKey:[[cellTree objectAtIndex:indexPath.section] objectAtIndex:indexPath.row]];
答案 1 :(得分:1)
在复杂的表视图中,我考虑将UITableViewDataSource例程拆分为子委托,每个部分有一个委托。因此,对于3个部分,我将创建3个单独的对象,每个对象负责为表的该部分提供UITableViewDataSource方法。然后,UITableView的委托只根据请求所针对的部分调度给其中一个相应的子委托。
答案 2 :(得分:1)
到目前为止,Cocoa With Love的帖子中介绍了执行此操作的最佳方法。基本上它是每个单元类型的自定义控制器,但最终实现起来非常简单。
答案 3 :(得分:0)
我认为这是非常常见的做法。请确保为这些不同的单元格指定唯一的单元格标识符。因此,细胞的缓存可以正常工作。