我有一个UITableView并且已经看到了这种效果,并希望为我们的followind数据实现它:
menu_header
menu_subheader
* item
* item
menu_subheader
* item
* item
* item
基本上,我想只显示标题和子标题,然后当用户点击其中一个子标题时,它会显示项目(最好是在动画块中)并适当地向下或向上调整其他单元格。像这样:
是否有预先构建的组件可以执行此操作?想一想,似乎我想将这些项目单元格设置为隐藏。我看过这个https://github.com/peterpaulis/StaticDataTableViewController,但看起来它不适用于动态数据。看起来这应该很简单。有关如何完成这项工作的任何想法?理想情况下,我希望能够在您单击它时插入数据,然后如果您单击另一个子标题,请关闭另一个子标题并添加到该子标题。
答案 0 :(得分:6)
实施"折叠"在表格视图中,您有两个选择:
insert
或deleteRowsAtIndexPaths:withRowAnimation:
方法。 beginUpdates
,然后再调用endUpdates
以重新计算高度并为新布局设置动画。 我在this GitHub repo中创建了第二个选项的简单实现。如果您对此有其他疑问,请与我们联系。
答案 1 :(得分:2)
您必须删除单元格并将其插入到表格视图中,而不是破坏它们的高度。
我们使用controller表视图,让您在实际处理表视图中行的删除/重新插入时“隐藏/显示”单元格。
“切换详细信息”在Demo上运行的方式与您尝试实现的方式非常类似:
- (IBAction)toggleDetails:(id)sender
{
// Hide if all hiddeable rows are hidden, show all otherwise
[self.topSection setObjectsAtIndexes:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(1, 3)]
hidden:(![self.topSection isObjectAtIndexHidden:1] &&
![self.topSection isObjectAtIndexHidden:2] &&
![self.topSection isObjectAtIndexHidden:3])];
}
更改单元格的高度以“隐藏”它们并不是最佳的,因为委托将被要求多次调整其大小,单元格仍然会被实例化并配置但不可见。
示例库将行数据保留在内存中(每行一个对象),同时重用单元格。对于大多数项目来说这应该没问题,但是在你的情况下,不仅所有对象都不应该在内存中,而且你不应该一次性获取所有对象。
答案 2 :(得分:1)
让你的标题将是Tableview Section和sub header将是Row ... 并且在didSelectRow委托方法中插入行,这将是您的项目。
答案 3 :(得分:1)
有一个sample code from Apple可以帮助您获得此结果
主要区别在于Apple示例代码是触发操作的标题并显示相对子视图,但这不是阻塞问题。
您可以使用普通单元格来实现这一点,方法是在选择其中一行时插入和删除行。
重要的是您需要重新映射数据源信息或将信息与另一个集合配对以获取该单元格的状态:打开或关闭以及子标题或项目以识别它们并在选择时选择正确的操作。
同样重要的是保持数据模型(数据源)和单元格数量之间的一致性,如果使用批量操作来广告插入和删除单元格不会有问题。如果你不这样做,你会看到很多例外
另请查看here。
答案 4 :(得分:1)
我其实只想添加评论,但声誉问题......
无论如何,我个人最喜欢的扩展/折叠UITableView部分的方法在本文中有所描述:https://stackoverflow.com/a/1941766/2440562
如果我正确理解了该问题,menu_headers
和menu_subheaders
将始终可见,只会显示/隐藏这些项目。
所以这是我的想法(让我们看看我能否解释得足够好):
您可能知道每个menu_subheaders
会有多少menu_header
(静态计数或数组元素的数量),因此您可以为每个menu_header添加一个部分(实际上只包含一个部分)您可以添加可扩展部分(menu_subheaders
),可以按照我上面提到的答案中的说明进行管理。并且当您想要在点击另一个时展开之前展开的menu_subheader
时,您可以重置其布尔值并使用reloadSections
方法重新加载。您必须对menu_headers
和menu_subheaders
的位置进行一些计算,但基本上您不必处理单元格高度和行插入和删除(实际上是我最喜欢的部分)。
这是我提到的计算的快速代码片段(未经过测试,完全即兴):
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
// Return the number of sections.
return <number_of_menu_headers> + <number_of_menu_subheaders>;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
if (indexPath.section == 0) {
// handle first menu_header
} else if (indexPath.section < 1 + <number_of_menu_subheaders1>) {
if (indexPath.row == 0) {
// handle the menu_subheader header row
} else {
// handle the rest of the items
}
} else if (indexPath.section == 1 + <number_of_menu_subheaders1>) {
// handle second menu_header
} else if (indexPath.section < 2 + <number_of_menu_subheaders1> + <number_of_menu_subheaders2>) {
if (indexPath.row == 0) {
// handle the menu_subheader header row for the current menu_subheader
} else {
// handle the rest of the items for the current menu_subheader
}
} etc...
}
再次,只是一个想法...