来自ios中Plist的嵌套可扩展UITableView

Ron*_*ayo 0 objective-c plist uitableview ios

您好可以使用plist在ios中创建可扩展的表格或视图吗?

这是plist文件和控件类型的意思

0 =开关

1 = TextField

PLIST

我可以迭代plist来创建一个可扩展的表视图吗?输出应该是这个.如果开关关闭,则父级的所有子父级将崩溃.我希望有一个人可以帮助我.提前致谢 在此输入图像描述

vok*_*lam 6

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

plist节点的结构.

节点包含以下属性:

  • 名称(单元格标题)
  • 级别(缩进级别,为简单而在plist中硬编码)
  • 折叠(湿节点折叠,响应用户交互而更改)
  • children(层次结构中的子节点)

plist层次结构的示例

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

数据结构

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

@interface ViewController ()
{
    NSMutableDictionary *_model;
    NSMutableArray *_items;
}
@end
Run Code Online (Sandbox Code Playgroud)

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

可能的解决方案是迭代所有节点,选择仅扩展并将它们添加到平面阵列.它可以递归地实现:

- (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;
}
Run Code Online (Sandbox Code Playgroud)

填充表视图

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

- (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];
}
Run Code Online (Sandbox Code Playgroud)

reloadItems使用新更改重新转换plist层次结构.如果要为更改设置动画,则需要额外的逻辑来插入/删除展开/折叠的单元格.