Question

I have an app that is going to navigate to a UISplitView (inside another view altogether) like so:

- (void) switchToMyDayView {
    NSLog(@"Show My Day Screen");

    if (self.myDayController.view.superview == nil) {
        if (self.myDayController == nil) {
            MyDayController *myController = [[MyDayController alloc] initWithNibName:@"MyDay" bundle:nil];
            self.myDayController = myController;
            [myController release];
        }

        [homeScreenController.view removeFromSuperview];
        [self.view insertSubview:self.myDayController.view atIndex:0];
    }
}

Which is done on the main navigation screen

Now, the MyDayController has a XIB called MyDay.xib which has these items:

File's Owner: MyDayController

First Responder: UIResponder

Split View Controller

 ---->Navigation Controller

         ---->Navigation Bar

         ----> Table View Controller

                 ----> Navigation Item

 ---->View Controller

So, I need some more components here, I need a UITableViewController and a UISplitViewControllerDelegate correct?

I was going to just implement these protocols in my MyDayController, is this sort of standard?

So, after the code above, I get an error:

-[UIViewController _loadViewFromNibNamed:bundle:] loaded the "MyDay" nib but the view outlet was not set.

so, how can I fix it using the UISplitViewController? I know that the UISplitViewController has a view property, but I cannot use it/connect it up in IB can I?

Thanks a lot

Mark

Was it helpful?

Solution

You shouldn't have to subclass UISplitViewController. What behavior is in your "MyDayController" class? UISplitViewController basically just handles laying out the master and detail views for you, so your responsibility is to implement those controllers.

If the split view is at the top level of your app, you can add it to your app's main window nib. If it isn't, just create it programatically:

- (void) switchToMyDayView {
    NSLog(@"Show My Day Screen");

    if (self.myDayController == nil) {
        YourMasterViewController *masterViewController = [[YourMasterViewController alloc] initWithNibName:@"MasterView" bundle:nil];
        YourDetailViewController *detailViewController = [[YourDetailViewController alloc] initWithNibName:@"DetailView" bundle:nil];
        UISplitViewController *myController = [[UISplitViewController alloc] init;
        myController.viewControllers = [NSArray arrayWithObjects:masterViewController, detailViewController, nil];
        [masterViewController release];
        [detailViewController release];

        self.myDayController = myController;
        [myController release];         
    }

    [homeScreenController.view removeFromSuperview];
    [self.view insertSubview:self.myDayController.view atIndex:0];
}

You also don't need the test for self.myDayController.view.superview == nil as it's implicit in self.myDayController == nil

OTHER TIPS

Thank you Christopher Pickslay. This solution works for me but I have to fix something you gave. Please see my code below.

Delegate file

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];

    LeftViewController *leftViewController = [[LeftViewController alloc] init];// initWithNibName:@"LeftViewController" bundle:nil];
    RightViewController *rightViewController = [[RightViewController alloc] initWithNibName:@"RightViewController" bundle:nil];
    UISplitViewController *myController = [[UISplitViewController alloc] init];
    myController.viewControllers = [NSArray arrayWithObjects:leftViewController, rightViewController, nil];

    self.window.rootViewController = myController;

    [self.window makeKeyAndVisible];
    return YES;
}

Hope this helps.

if you want to create with navigation controller in both master and detail then you can do this

self.rootViewController=[[RootViewController alloc]init];
    self.detailViewController=[[FirstDetailViewController alloc]init];

    UINavigationController *rootNav=[[UINavigationController alloc]initWithRootViewController:rootViewController];
    UINavigationController *detailNav=[[UINavigationController alloc]initWithRootViewController:detailViewController];

    self.splitViewController.viewControllers=[NSArray arrayWithObjects:rootNav,detailNav,nil];
    self.splitViewController.delegate=self.detailViewController;
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top