I’m trying to load a specific UITableViewController as the Detail view of a UISplitViewController when the user selects a cell within the Master view; but having some problems. When i select the cell, it just shows a blank window with out a table view controller.
However if i change the App Delegate to just load the UITableView controller without using the UISplitViewController it works fine, so i know it’s a problem with the way i’ve coded the UISplitViewController.
The view hierachy:
UISplitViewController
-->
UINavigationController
--> UITableViewController (DetailViewController)
UINavigationController
--> UIViewController (ColorViewController)
The user selects a cell in ColorViewController and that should change the DetailViewController.
In AppDelegate.m:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
self.viewController = [[ViewController alloc] init];
self.window.rootViewController = [self.viewController splitViewController];
[self.window makeKeyAndVisible];
return YES;
}
In ViewController.m:
- (UIViewController *) splitViewController {
// Create the navigation-run root view
ColorViewController *rootVC = [ColorViewController controller];
UINavigationController *rootNav = [[UINavigationController alloc] initWithRootViewController:rootVC];
// Create the navigation-run detail view
DetailViewController *detailVC = [DetailViewController controller];
UINavigationController *detailNav = [[UINavigationController alloc] initWithRootViewController:detailVC];
// Add both to the split view controller
svc = [[UISplitViewController alloc] init];
svc.viewControllers = [NSArray arrayWithObjects: rootNav, detailNav, nil];
svc.delegate = detailVC;
return svc;
}
In ColorViewController.m:
@interface ColorViewController : UITableViewController
...
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
UIViewController *controller = (UIViewController *)self.splitViewController.delegate;
TableViewController *tvc = [[TableViewController alloc] init];
[controller.view addSubview:tvc.view];
}
What’s the best way to change the Detail view within a UISplitViewController? Should i just add the replacement view to UIViewController like above or is there a better way? Maybe that’s the cause of my problem?
I’m going to answer my own question..
For some reason, in the Master view (ColorViewController), the detail object
TableViewController *tvcneeds to be declared as an instance variable, not as a variable within a method.After doing that, it works and displays the table properly.
I don’t really understand why though, if anyone would like to try to explain.
Cheers,