如何创建具有多种单元格类型的分组表视图?
Posted
技术标签:
【中文标题】如何创建具有多种单元格类型的分组表视图?【英文标题】:How to create a grouped table view with multiple cell types? 【发布时间】:2013-04-02 14:00:59 【问题描述】:我没有使用故事板,它是 ios 6。
当所有单元格都是相同类型时,我知道该怎么做,但我需要一个包含多种单元格类型的分组表视图。举个例子,假设第一个单元格需要是UITableViewCellStyleValue1
,第二个单元格需要是UITableViewCellStyleSubtitle
,第三个单元格是自定义单元格(UITableViewCell
子类,它有一个 xib,因此可以使用与registerNib:forCellReuseIdentifier:
。
主要是我不确定构建tableView:cellForRowAtIndexPath:
的最佳方式。但我不确定是否应该注册自定义单元格或全部。
最好的方法是什么?
【问题讨论】:
我猜这是一个可变长度表,而静态表不能满足您的需求?您提到有一个单独的 XIB 文件用于自定义单元格布局。您可以在与表格相同的 XIB 中创建自定义单元格,并在那里设置重用标识符。它更容易并且适用于许多情况。你有什么不适合你的特殊情况吗? @DBD 我已经编辑了问题以表明它是静态的。我不认为我在为自定义单元格设置重用标识符的位置而苦苦挣扎,但如果这是解决方案,请详细说明。 @DBD 另外,我在许多其他地方都在使用该自定义单元格,因此最好有自己的 xib 文件。如果我错了,请纠正我。 【参考方案1】:你走在正确的道路上。由于您的自定义单元格正在其他地方使用,因此 xib 是加载它的好地方。至于实现,你可以做这样的事情。
假设您的表格视图是“静态的”并且有三个单元格,您可以在 viewDidLoad
中注册您的自定义笔尖:
- (void)viewDidLoad
[super viewDidLoad];
UINib *customCellNib = [UINib nibWithNibName:@"CustomCell" bundle:nil];
[self.tableView registerNib:customCellNib forCellReuseIdentifier:@"CustomIdentifier"]
然后在cellForRowAtIndexPath:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
UITableViewCell *cell = nil;
if(indexPath.row == 0)
cell = [tableView dequeueReusableCellWithIdentifier:@"CellIdentifier1"];
if(cell == nil)
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1
reuseIdentifier:@"CellIdentifier1"];
/* Cell 2 ommited for brevity */
else if(indexPath.row == 2)
//Just to demonstrate the tableview is returning the correct type of cell from the XIB
CustomCell *customCell = [tableView dequeueReusableCellWithIdentifier:@"CustomIdentifier"];
cell = customCell;
[self configureCell:cell atIndexPath:indexPath];
return cell;
最后在 IB 中为 Xib 设置正确的Identifier
为单元格。
更新
- (void)configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath
if(indexPath.row == 0)
cell.textLabel.text = [NSString stringWithFormat:@"Cell %d", indexPath.row];
else
//custom cell here
//cell.textfield.text = @"blah blah";
配置单元格方法在某种程度上是用于主要使用NSFetchedResultsController(及其使用的delegate)放置的表格视图单元格的约定
这只是用适当的内容重置重复使用的单元格的一种便捷方法,并使cellForRowAtIndexPath:
更易于阅读。我什至制作了多个版本的 configureCell,例如 configureCustomCell1:atIndexPath
,以进一步提高可读性。
希望这会有所帮助!
【讨论】:
是的,很有帮助!在xib中为自定义单元格设置Identifier
有什么好处?
您能否也显示configureCell:atIndexPath:
的代码?我假设它的方法签名是这样的:- (UITableViewCell *)configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath
。一旦进入那里,CustomCell 怎么知道它是 CustomCell?使用演员表?这样做的最佳方式/地点是什么?
其实很有趣的问题,为什么要在 IB 中设置 Identifier?据我所知,在这种情况下您不需要这样做,因为您使用的是registerNib:forCellReuseIdentifier:
。 tablview 在没有设置标识符的情况下正确地重用这些单元格。如果您使用其他各种较旧的方法之一从 xib 中提取单元格,您可能需要设置它。我很快就会用 configureCell 实现更新我的答案。
我必须在 configureCell:atIndexPath:if (indexPath.section == sectionWithCustomCells) CustomCell *customCell = (CustomCell *)cell; ...
【参考方案2】:
如果您使用的是静态表,则不需要重用标识符或其他任何东西,因为不会再使用任何单元格。只需将表格设置为“分组”样式的“静态单元格”并设置所需的部分数。您可以单击“表格视图部分”并设置该部分中的行数(并设置您可能需要的任何页眉/页脚)。
然后根据需要配置单元格。您可以选择默认单元格或将单元格设为“自定义”并从对象库中拖动 UI 组件。您可以为静态表格单元格中的组件设置IBOutlets
或IBActions
,就像在普通视图中设置组件一样。
【讨论】:
我没有看到Content: Static Cells
或 Sections:
我没有使用 Storyboard。这有区别吗?
但是我可以为这个表格视图使用故事板吗?
要创建静态表,您需要使用情节提要。您可以轻松地创建一个包含单个视图控制器的故事板,但您不能在故事板中创建一个没有视图控制器的视图。
感谢您的努力,但我不愿意接受答案,因为我希望有人可以解释如何仅使用 xibs 来做到这一点。
这丝毫不影响我。遗憾的是,XIB 不支持静态表格视图。您可以创建一个带有“视图”的 XIB,即您的 UITableView
和更多视图,即您的 UITableViewCells
,并使用标准重用系统将它们全部加载(即使没有真正被重用)。 以上是关于如何创建具有多种单元格类型的分组表视图?的主要内容,如果未能解决你的问题,请参考以下文章
表格视图中的分组单元格在下一节标题之前具有半透明区域/填充。我该如何改变呢?
如何使用来自另一个视图控制器swift的用户输入创建具有表视图单元格的列表