user123
user123

Reputation: 2721

How to load a different view to detail view in split view iOS

I was wondering how I can load a different view into the detailView from rootview..

   - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
    {

        if (indexPath.row == 0) {
            SecondViewController *svc = [[SecondViewController alloc] init];

            //[self.navigationController pushViewController:svc animated:YES]; 

        }


}

Upvotes: 1

Views: 7269

Answers (2)

andrewbuilder
andrewbuilder

Reputation: 3791

My solution is using Using Xcode 7.1.1 for a universal app, using Storyboards, Auto Layout and Size Classes, building for iOS 9...

I used a version of Midhun MP's answer... within the current/original (not replacement/new/second) detail view controller's viewDidLoad method:

obviously first import the correct header file for your controller:

#import "NEW_DetailViewController.h"

then within viewDidLoad method:

- (void)viewDidLoad {
    [super viewDidLoad];

    <<OTHER_CODE>>

    if (<<INSERT_THE_LOGIC_YOU_NEED_TO_TRIGGER_THE_REPLACEMENT_DETAIL_VC>>) {
        NEW_DetailViewController *viewNewDetailVC = [[NEW_DetailViewController alloc] initWithNibName:@"NEW_DetailViewController" bundle:nil];

        UINavigationController *navController = [[UINavigationController alloc] init];
        [navController pushViewController:viewNewDetailVC animated:YES];

        NSArray *arraySplitViewControllers = [[NSArray alloc] initWithObjects:[self.splitViewController.viewControllers objectAtIndex:0],navController,nil];

        self.splitViewController.viewControllers = arraySplitViewControllers;
    }
}

NOTE I could make this code work without loading a XIB file, building the entire replacement detail VC in code, with [[UIViewController alloc] init] instead of [[NEW_DetailViewController alloc] initWithNibName:@"NEW_DetailViewController" bundle:nil], but was frustrated that I could not make the XIB file load, so I persisted...

I attempted many variations from many different SO answers in attempting to solve this problem of successfully loading a XIB file as the replacement detail view controller in a split view controller.

Finally this answer by Travis M gave me the hint I needed...

Delete all the efforts you have attempted to date to create a new XIB file and subclass of UIViewController!

Create a new file and make it a subclass of UIViewController. See screenshot:

Screenshot of new subclass of new UIViewController

IMPORTANT ensure you check the checkbox "Also create XIB file".

You don't need to modify the new subclass of UIViewController, unless you'd like to code up the contents of the view. I only needed to add in a UILabel for my solution and I did this using Interface Builder.

Make sure you reference the replacement view controller NEW_DetailViewController in code as per my example above.

That's it!

In your XIB file you should end up with the following:

Files Owner -> subclass: NEW_DetailViewController

Files Owner -> Outlet:view

View -> Referencing Outlet:view

Upvotes: 0

Midhun MP
Midhun MP

Reputation: 107141

The splitviewcontroller has an array of 2 views one is root view and another one is detail view,and you can change the views in this array. If you alloc and init a view and replace it with either of these two then this view will replace the current view in the splitviewcontroller.

Use this code for loading different views for different cells of rootview. Change rootview's didSelectRowAtIndexPath method as follow:

- (void)tableView:(UITableView *)aTableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{

    UIViewController  *localdetailViewController = nil;

    if (indexPath.row==0)
    {

    DetailViewController *detailView=[[DetailViewController alloc] initWithNibName:@"DetailView" bundle:nil];

    localdetailViewController=detailView;

    detailView=nil;

    }

    if (indexPath.row==1)
    {

    SecondViewController *secondDetailView=[[SecondViewController alloc] initWithNibName:@"SecondDetailViewController" bundle:nil];

    localdetailViewController=secondDetailView;
    secondDetailView = nil;
    }

    UINavigationController *navController=[[UINavigationController alloc] init];

    [navController pushViewController:localdetailViewController animated:YES];

    YourSplitViewAppDelegate *delegate=[[UIApplication sharedApplication] delegate];

    NSArray *viewControllers=[[NSArray alloc] initWithObjects:[delegate.splitViewController.viewControllers objectAtIndex:0],navController,nil];

    delegate.splitViewController.viewControllers = viewControllers;

    [localdetailViewController release];

    [navController release];

    }

Upvotes: 4

Related Questions