UITableView 的大纲视图
Posted
技术标签:
【中文标题】UITableView 的大纲视图【英文标题】:Outline view from UITableView 【发布时间】:2010-05-18 13:52:07 【问题描述】:我需要从 UITableView 中实现 1 级大纲视图。有孩子的单元格将有一个“+”符号,如果用户点击它,它下面的单元格应该向下滑动并且应该出现当前选定行的子单元格。单元格的滑动应该是可见的,如果用户点击已展开行的“-”按钮,子单元格应该滑回父单元格。
我试过谷歌搜索,但没有找到任何指针。
我应该如何开始,我应该继承 UITableView 吗?还是我应该实现自己的视图子类并处理那里的所有东西?
我觉得子类化 UITableView 会更容易,因为它会为我们处理所有的行选择,但我不知道该怎么做。
感谢和问候, 拉杰
【问题讨论】:
【参考方案1】:您不能将字典作为数据源进行维护吗?保存字典数组的字典。以及带有两个键值对的内部字典:
-
是扩展的
儿童信息。
通过检查 bool isExpanded 您将获得行数。并且您需要自定义单元格以添加按钮。它对你有用吗?
您可以通过将单元格内容稍微向右推来区分子单元格。
【讨论】:
好的,所以如果行展开,我会在tableView委托中引入更多的numberOfRows。使用这种方法如何实现需要展开的行下方的项目的滑动效果?我想,这里也发生了同样的问题,当表视图在行扩展时重新出现时,tableView 的重新出现。 好吧,我想必须扩展的行下方的行的滑动由表视图自动处理。我将不得不使用您和 Espuz 的混合解决方案。谢谢两者。 . .【参考方案2】:你必须继承和 UITableViewCell
@interface OutlineCell : UITableViewCell
然后,在表格的 ViewController 中
- (UITableViewCell*) tableView: (UITableView*) tableView cellForRowAtIndexPath: (NSIndexPath*) indexPath
NSString* MyIdentifier = @"MyIdentifier";
OutlineCell* cell = (OutlineCell*) [tableView dequeueReusableCellWithIdentifier: MyIdentifier];
if (cell == nil)
cell = [[OutlineCell alloc] init];
// Populate cell data
您可以通过 IB 定义界面,创建一个 Empty XIB 并拖动一个 UITableViewCell,并将您的自定义 OutlineCell 类作为文件所有者。然后添加按钮、标签等。
编辑:如果您想要一个单元格内的内部表格,请尝试使用相同的方法向您定义的 UITableViewCell 添加一个子视图,其中包含一个 UITableView。
【讨论】:
好方法,我怎么没想到呢?好吧,我有一个疑问,如何实现要扩展的行下方的行的滑动效果?有什么想法吗?根据这种方法,我相信我们必须为每一行提供行高,所以当一个表格行被扩展时,我们根据子项的数量提供新行。假设原来的行高是20,现在有5个孩子,新的行高是100。我猜表格只是重新出现新的行高,没有滑动效果,如何规避? 好吧,我不知道这是否有效,但是当点击 + 按钮时,要展开行并显示子行,您必须获取单元格的框架并更改大小UIView 动画块中的 .height 属性。当我使用信息面板而不是折叠和展开时,这对我有用。也许它也适用于这种情况^^ 注意:这是一个很好的方法,但我发现在重新加载表格数据和动画期间非常困难。新的 tableView 可以通过增加它的高度嵌入到单元格中,但是当动画开始播放时,作为子视图添加的 tableView 会在单元格后面,原因 - 我不知道!此外,我真的怀疑主 tableView 的 tableView 重新加载调用是否会重新加载内部 tableView。如果没有,我们可以在委托第一个tableView的-tableView:cellForRowAtIndexPath:时重新加载数据,但我怀疑重新加载的顺序。更好的方法 - 扁平化树结构。以上是关于UITableView 的大纲视图的主要内容,如果未能解决你的问题,请参考以下文章
word中一共有几种视图方式,并且如何区分几种视图关系,如:页面视图、大纲视图等等