Search code examples
iphoneiosuinavigationbaruinavigationitem

Left Arrow - UINavigationItem


I've searched around and I can't seem to figure it out. I'm sure many people will have links for me and such, which I've most likely already looked at. But if someone could please just show me code to do the following:

I'd like to have a left arrow in my UINavigationBar as a "Back" UINavigationItem. How can I do this? Here is my current code in my UIViewController:

theBar = [[UINavigationBar alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 320.0f, 48.0f)];

UIBarButtonItem *leftButton = [[UIBarButtonItem alloc] initWithTitle:@"Back" style:UIBarButtonItemStyleBordered target:nil action:@selector(backButtonSelected:)];

UIBarButtonItem *rightButton = [[UIBarButtonItem alloc] initWithTitle:@"Options" style:UIBarButtonItemStyleBordered target:nil action:@selector(optionsButtonSelected:)];

UINavigationItem *item = [[UINavigationItem alloc] initWithTitle:@"Title"];
item.leftBarButtonItem = leftButton;
item.hidesBackButton = YES;
item.rightBarButtonItem = rightButton;

[self.view addSubview:theBar];

Solution

  • You should use an UINavigationController in order to pop/push UIViewControllers on your screen. The navigation controller will add an UINavigationBar to your UIViewControllers automatically so you will not need to create them as you did.

    Here is a sample. I didn't looked for memory leaks. In the app delegate you'll find this method:

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    {        
        // Override point for customization after application launch.
        MainVC *mainVC = [[MainVC alloc] init];
        UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:mainVC];
        [self.window addSubview:navController.view];
        [self.window makeKeyAndVisible];
    
        return YES;
    }
    

    MainVC is a UIViewController that represents the level 1 of the hierarchy. in it i have

    - (void)loadView
    {
        self.view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 480)];
        self.view.backgroundColor = [UIColor redColor];
        self.title = @"MainVC";
    
        UIBarButtonItem *rightButton = [[UIBarButtonItem alloc] initWithTitle:@"SecondLevel" style:UIBarButtonItemStyleBordered target:self action:@selector(secondLevelSelected:)];
        self.navigationItem.rightBarButtonItem = rightButton;
    }
    
    - (void) secondLevelSelected:(id)sender
    {
        SecondVC *secondVC = [[SecondVC alloc]  init];
        [self.navigationController pushViewController:secondVC animated:YES];
    }
    

    SecondVC is another UIViewController that represents the second level of the hierachy. Here you will find the back button that you want.

    - (void)loadView
    {
        self.view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 240)];
        self.view.backgroundColor = [UIColor greenColor];
        self.title = @"SecondVC";
    
        self.navigationItem.hidesBackButton = YES;
        UIBarButtonItem *leftBtn = [[UIBarButtonItem alloc] initWithTitle:@"FirstLevel" style:UIBarButtonItemStyleBordered target:self action:@selector(leftBtnSelected:)];
        self.navigationItem.leftBarButtonItem = leftBtn;
    }
    
    - (void) leftBtnSelected:(id)sender
    {
        [self.navigationController popViewControllerAnimated:YES];
    }