I want to build an app to navigate a data hierarchy. The structure of this hierarchy is something like the one I\'m showing in the following image. A branch of the structure
Sure, you can re-use a UITableView
. The UITableView
has 2 fundamental pieces, the UITableViewDelegate
and the UITableViewDataSource
.
UITableViewDelegate controls a lot of the table interaction and some display characteristics (heightForRowAtIndexPath
and such). What happens when you select a row. Can you even select a row?
UITableViewDataSource is the well, source of the data. How many sections does the table have? How many rows in each section? What are the content of the cell at Section X, row Y?
You could for instance, use the same UITableView
and UITableViewDelegate
for each table in your hierarchy, but change the UITableViewDataSource
. When you want to change the data source, you might do something like...
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 should answer a lot of questions you might run into how implementation.
To recurse to arbitrary depth with only a single VC painted in storyboard, use storyboard to paint the top level: a navigation controller with a table view controller at it's root. The table vc should be a UITableView subclass, and have a storyboard identifier in storyboard (say, "MyCustomTableVC").
Give MyCustomTableVC a public property (say, ModelItem *node) that indicates which node in your model it should present.
Instead of storyboard segues, when the table vc gets didSelectRowAtIndexPath
, have it create another instance of itself...
UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"MainStoryboard"
bundle: nil];
// Imagine it's called MyCustomTableVC
MyCustomTableVC *newVC = (MyCustomTableVC*)[mainStoryboard
instantiateViewControllerWithIdentifier: @"MyCustomTableVC"];
Set the newVC model node to the selected item (the item in your model at indexPath.row), and then push to it...
// 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];
This approach has the benefit of getting all the navigation controller behavior: animated pushes and pops, back buttons, etc.