使用UITableView深入分层数据

时间:2013-02-27 15:16:39

标签: objective-c data-structures uitableview uistoryboard

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

enter image description here

我想用TableViews深入研究这个结构:

    A > AA > AAB > AABA

    A > AB > ABA

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

2 个答案:

答案 0 :(得分:7)

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

为MyCustomTableVC提供一个公共属性(比如,ModelItem *节点),指示模型中应该显示哪个节点。

当表格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];

此方法具有获取所有导航控制器行为的好处:动画推送和弹出,后退按钮等。

答案 1 :(得分:1)

当然,您可以重复使用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应该回答很多可能会遇到的问题。