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

标签 ios objective-c uitableview plist

您好,可以使用 plist 在 ios 中创建可扩展的表或 View 吗?

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

0 = 切换

1 = 文本字段

pList

我可以迭代 plist 来创建一个可扩展的 TableView 吗?输出应该是这样的。如果开关关闭,父项的所有子父项都将崩溃。我希望有一个人可以帮助我。先谢谢了 enter image description here

最佳答案

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

plist 节点的结构。

节点包含以下属性:

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

example of plist hierarchy

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

数据结构

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

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

将 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;
}

填充 TableView

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

- (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 层次结构。如果您想为更改设置动画,您需要额外的逻辑来插入/删除展开/折叠的单元格。

关于ios - 来自 ios 中 Plist 的嵌套可扩展 UITableView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21773856/

相关文章:

ios - 如何检测iOS设备是否支持推送通知?

iphone - 如何比较两个NSMutableArray?

objective-c - 使用 OpenGL ES 模板时的错误信息

ios - 如何使用按钮动态地将单元格添加到我的 TableView 中

objective-c - 是什么导致表格单元格以随机/未知模式显示?

iOS - Objective-C 无法使具有标识符的单元格出队

ios - 使用通用函数

ios - 如何将箭头附加到 UIBezierPath

objective-c - 在 ARC 下解除分配时是否需要在 NSArray 上调用 removeAllObjects?

ios - 如何将 Get 请求 AFNetworking 中的 responseObject 保存到 nsarray?