【问题标题】:Drill down hierarchical data with UITableView使用 UITableView 向下钻取分层数据
【发布时间】:2013-02-13 11:15:57
【问题描述】:

我想构建一个应用来导航数据层次结构。此层次结构的结构类似于我在下图中显示的结构。结构的一个分支可能比其他分支具有更多级别。

我想用这样的 TableViews 深入了解这个结构:

    A > AA > AAB > AABA

    A > AB > ABA

我想知道的是,我的情节提要中是否可以只有一个 TableViewController 并重用它来显示每个新级别的数据? 我不想在我的故事板中将一堆 tableviewcontrollers 链接在一起,因为我不确定我是否会有 3、4 或 100 个级别的层次结构。

【问题讨论】:

    标签: objective-c data-structures uitableview uistoryboard


    【解决方案1】:

    要在 storyboard 中仅绘制一个 VC 递归到任意深度,请使用 storyboard 绘制顶层:一个导航​​控制器,其根部有一个表视图控制器。表 vc 应该是一个 UITableView 子类,并且在故事板中有一个故事板标识符(例如,“MyCustomTableVC”)。

    给 MyCustomTableVC 一个公共属性(例如,ModelItem *node),指示它应该呈现在模型中的哪个节点。

    当表 vc 获取 didSelectRowAtIndexPath 时,与其创建故事板 segues,不如让它创建另一个自己的实例...

    UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"MainStoryboard"
                                                             bundle: nil];
    // Imagine it's called MyCustomTableVC
    MyCustomTableVC *newVC = (MyCustomTableVC*)[mainStoryboard 
                        instantiateViewControllerWithIdentifier: @"MyCustomTableVC"];
    

    将 newVC 模型节点设置为选中项(模型中 indexPath.row 中的项),然后推送到它...

    // making up a lot of stuff about your model here, but hopefully you get the idea...
    newVC.node = [self.model objectAtIndex:indexPath.row];
    [self.navigationController pushViewController:newVC animated:YES];
    

    这种方法的好处是可以获取所有导航控制器行为:动画推送和弹出、后退按钮等。

    【讨论】:

    • 我尝试了这个解决方案并且它有效,但是导航栏消失了,所以我无法返回到层次结构的上一层。有什么想法吗?
    • 我唯一能想到的就是确保你执行 self.navigationController push,不存在。
    • @danh 节点是什么意思?您会偶然知道如何在 swift 3 中执行此操作吗?
    • @danh 有没有办法在没有节点的情况下做到这一点?就像我如何用其他东西替换行 newVC.node = [self.model objectAtIndex:indexPath.row]; 以避免节点并在视图控制器本身中以编程方式完成其余部分?
    • @Number1 - 抱歉,我不确定我是否理解你。在上面的建议中,模型是一棵树,VC 导航那棵树。导航说,“我们在树上的某个位置(我称之为node),这是那个节点的孩子。如果用户选择一个,访问那个节点”。删除节点就是删除你在树中位置的知识。
    【解决方案2】:

    当然,您可以重复使用UITableViewUITableView 有 2 个基本部分,UITableViewDelegateUITableViewDataSource

    UITableViewDelegate 控制很多表格交互和一些显示特性(heightForRowAtIndexPath 等)。当您选择一行时会发生什么。你甚至可以选择一行吗?

    UITableViewDataSource 是井,数据的来源。表有几个部分?每个部分有多少行?第 X 节第 Y 行的单元格内容是什么?

    例如,您可以为层次结构中的每个表使用相同的UITableViewUITableViewDelegate,但更改UITableViewDataSource。当您想更改数据源时,您可能会执行类似...

    if (isSingingBand) {
        self.tableview.dataSource = [TableABBADataSource alloc] init];
    } else {
        self.tableview.dataSource = [TableAABDataSource alloc] init];
    }
    [self.tableview reloadData];
    

    Apple's programming guide on Table Views 应该回答您可能遇到的很多问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多