Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

UINavigationController: Simplest Example

I'm trying to do very simple example of a UINavigationController. Here is my code:

- (void)viewDidLoad {
  [super viewDidLoad];

This next line works, or at least doesn't blow up.

  navController = [[UINavigationController alloc] initWithRootViewController:self];
  self.title = @"blah";

  PageOneController *one = [[[PageOneController alloc]init] autorelease];

Example 1. THIS LINE DOES NOTHING

  [navController pushViewController:one animated:NO];

Example 2. THIS LINE WORKS (but no nav controller, of course)

  [self.view addSubview:one.view];
}

Why am I unable to push ViewController instances onto the navController and see the screen change?

Note: I realize that I might have my concepts backwards and I don't need to have my view referencing a UINavigationController... or something.

like image 882
Dan Rosenstark Avatar asked Jun 19 '10 23:06

Dan Rosenstark


People also ask

What is a UINavigationController?

A container view controller that defines a stack-based scheme for navigating hierarchical content.

How do I get the most popular view controller?

In addition, you can check for UINavigationController and ask for its topViewController or even check for UITabBarController and ask for selectedViewController . This will get you the view controller that is currently visible to the user.

How do I use navigation controller in Swift?

Enter Swift as Language and choose Next. Go to the Storyboard and delete the View Controller. Open the Object Library and drag a Navigation Controller to the Storyboard. Select the Navigation Controller and go to The Attribute inspector.


2 Answers

- (void)viewDidLoad {
    [super viewDidLoad];

    PageOneController *one = [[[PageOneController alloc]init] autorelease];
    one.title = @"blah";
    navController = [[UINavigationController alloc] initWithRootViewController:one];
    [self.view addSubview:navController.view];
}

The basic idea behind it is that a navigation controller's root view controller is the controller which view will be displayed first in the navigation controller hierarchy. The root controller is not the view controller that you plug the navigation controller into. Hope this helps.

like image 88
eploko Avatar answered Nov 12 '22 14:11

eploko


I'm just restating @E-ploko's answer, which is 100% correct (which is why I marked it best answer).

You need more views (and view controllers) to use the UINavigationController. One of them houses the UINavigationController, and its rootViewController is the first page of the series (the one that has no "back").

I got rid of the external dependencies for the code sample: obviously this is monolithic sample code, not monolithic real code.

- (void)viewDidLoad {
    [super viewDidLoad];

    UIViewController *one = [[UIViewController alloc] init];

    [one.view setBackgroundColor:[UIColor yellowColor]];
    [one setTitle:@"One"];

    navController = [[UINavigationController alloc] initWithRootViewController:one];
    // here 's the key to the whole thing: we're adding the navController's view to the 
    // self.view, NOT the one.view! So one would be the home page of the app (or something)
    [self.view addSubview:navController.view];

    // one gets reassigned. Not my clearest example ;)
    one = [[UIViewController alloc] init];

    [one.view setBackgroundColor:[UIColor blueColor]];
    [one setTitle:@"Two"];

    // subsequent views get pushed, pulled, prodded, etc.
    [navController pushViewController:one animated:YES];
}
like image 38
Dan Rosenstark Avatar answered Nov 12 '22 15:11

Dan Rosenstark