从ios中的Plist嵌套展开式UITableView
嗨,是否有可能使用plist创build一个可扩展的表或ios视图?
这里是plist文件和控制types的意思
0 =开关
1 = TextField
我可以迭代plist创build一个可展开的表视图? 而输出应该是这个。 如果开关closures,则父项的所有子父项都将折叠。 我希望有一个人可以帮助我。 先谢谢了
我们从基本的想法开始。 我将专注于展开/折叠function,忽略单元格types(开关,文本框,等等)。 表视图层次结构受限于段级别和行级别。 要求是实现任意数量的嵌套级别。 但是我们可以使用indentationLevel
属性缩进单元格。 表视图将包含一个部分,其中包含提供级别信息的展开(过滤)单元格。 因此,目标是将深层次的层次结构转换为平面层次结构,在填充表格视图时更易于操作。
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来实现
希望这会有所帮助。