从ios中的Plist嵌套展开式UITableView

嗨,是否有可能使用plist创build一个可扩展的表或ios视图?

这里是plist文件和控制types的意思

0 =开关

1 = TextField

PLIST

我可以迭代plist创build一个可展开的表视图? 而输出应该是这个。 如果开关closures,则父项的所有子父项都将折叠。 我希望有一个人可以帮助我。 先谢谢了 在这里输入图像说明

我们从基本的想法开始。 我将专注于展开/折叠function,忽略单元格types(开关,文本框,等等)。 表视图层次结构受限于段级别和行级别。 要求是实现任意数量的嵌套级别。 但是我们可以使用indentationLevel属性缩进单元格。 表视图将包含一个部分,其中包含提供级别信息的展开(过滤)单元格。 因此,目标是将深层次的层次结构转换为平面层次结构,在填充表格视图时更易于操作。

plist节点的结构。

节点包含以下属性:

  • 名称(单元格标题)
  • 级别(缩进级别,为简单起见,在plist中硬编码)
  • 折叠(其它节点折叠,在用户交互响应中改变)
  • 儿童(层次结构中的子节点)

plist层次结构的例子

根元素必须是字典,如果使用dictionaryWithContentsOfFile:用于plist加载。 为了保持顶级节点的顺序不变,我们使用数组作为根容器。

数据结构

Plist层次结构由NSMutableDictionary表示(可变性是必需的,因为我们将更改collapsed属性)。 表视图平面层次由NSMutableArray (敬请期待)表示。

 @interface ViewController () { NSMutableDictionary *_model; NSMutableArray *_items; } @end 

将plist层次结构转换为平面层次结构

可能的解决scheme是遍历所有节点,select仅扩展,并将其添加到平面数组。 它可以recursion地实现:

 - (void)reloadExpandedItems { for (NSDictionary *item in _model[@"items"]) { [_items addObject:item]; [self reloadExpandedItemsForItem:item]; } } - (void)reloadExpandedItemsForItem:(NSDictionary*)item { if ([item[@"collapsed"] boolValue]) { return; } for (NSDictionary *child in item[@"children"]) { [_items addObject:child]; [self reloadExpandedItemsForItem:child]; } return; } 

填充表格视图

我们需要设置缩进级别并响应用户交互(折叠/展开)单元格。

 - (NSInteger)tableView:(UITableView *)tableView indentationLevelForRowAtIndexPath:(NSIndexPath *)indexPath { return [_items[indexPath.row][@"level"] integerValue]; } - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { NSMutableDictionary *item = _items[indexPath.row]; item[@"collapsed"] = @(![item[@"collapsed"] boolValue]); // inverse bool value [self reloadItems]; } - (void)reloadItems { [_items removeAllObjects]; [self reloadExpandedItems]; [self.tableView reloadData]; } 

reloadItems plist层次结构。 如果你想animation变化,你需要额外的逻辑来插入/删除展开/折叠的单元格。

看这个问题 。 长话短说 – 没有select的标准UITableView类使其可扩展如.plist。 你必须自己实现这个function,或者使用这个例子

苹果有一个示例项目,它使用plist的数据,并使用tableView中的可扩展部分来填充它。 以下是链接: https : //developer.apple.com/library/ios/samplecode/TableViewUpdates/Introduction/Intro.html

这种嵌套的TableView可以很容易地通过一个非常好的Github库RATreeView来实现

希望这会有所帮助。