UINavigationController "back button" custom text?

IosIphoneUinavigationcontroller

Ios Problem Overview


The "back button" of a UINavigationController by default shows the title of the last view in the stack. Is there a way to have custom text in the back button instead?

Ios Solutions


Solution 1 - Ios

From this link:

self.navigationItem.backBarButtonItem =
   [[UIBarButtonItem alloc] initWithTitle:@"Custom Title"
            style:UIBarButtonItemStylePlain
           target:nil
           action:nil];

As Tyler said in the comments:

> don't do this in the visible view controller, but in the view > controller that you'd see if you hit the back button

Solution 2 - Ios

You can set the text in the Interface Builder:

Select the navigation item of the ViewController that the back button would return to:

enter image description here

In the utilities panel attribute inspector, enter your label for the Back Button:

enter image description here

I would prefer this approach over setting the title in code as in the accepted answer.

> Also note, you need to do this in the view controller one level up the > stack. In other words, don't do this in the visible view controller, > but in the view controller that you'd see if you hit the back button.
> --Tyler

Solution 3 - Ios

I use this:

// In the current view controller, not the one that is one level up in the stack
- (void)viewDidLoad {
    [super viewDidLoad];
    self.navigationController.navigationBar.backItem.title = @"Custom text";
}

Solution 4 - Ios

I found a handy solution to this by simply setting the title of the controller before pushing another controller onto the stack, like this:

self.navigationItem.title = @"Replacement Title";
[self.navigationController pushViewController:newCtrl animated:YES];

Then, make sure to set the original title in viewWillAppear, like this:

-(void)viewWillAppear:(BOOL)animated
{
  ...
  self.navigationItem.title = @"Original Title";
  ...
}

This works because the default behavior of UINavigationController when constructing the back button during a push operation is to use the title from the previous controller.

Solution 5 - Ios

The title of the back button defaults to the previous view's title so a quick trick I use is to place the following code on the previous view's .m file.

-(void)viewWillAppear:(BOOL)animated {

    // Set title
    self.navigationItem.title=@"Original Title";
}

-(void)viewWillDisappear:(BOOL)animated {

    // Set title
    self.navigationItem.title=@"Back";
}

Solution 6 - Ios

in your init method, add the following code:

- (id)initWithStyle:(UITableViewStyle)style {
	if(self = [super init]) {

		//...

		UIBarButtonItem *customBackButton = [[UIBarButtonItem alloc] initWithTitle:@"Back" 
										     style:UIBarButtonItemStylePlain 
										    target:self 
										    action:@selector(goBack)];
		self.navigationItem.leftBarButtonItem = customBackButton;
		[customBackButton release];

		//...
	}
    return self;
}

then add a simple method, to allow viewcontroller dismissing:

-(void)goBack {
	[self.navigationController popViewControllerAnimated:YES];	
}

Solution 7 - Ios

Add the following code in viewDidLoad or loadView

self.navigationController.navigationBar.topItem.title = @"Custom text";

I tested it in iPhone and iPad with iOS 9

Solution 8 - Ios

Adding to rein's answer. Note from Apple's docs that the declaration of backBarButtonItem is this:

@property(nonatomic, retain) UIBarButtonItem *backBarButtonItem

Therefore, rein's answer will leak memory because the synthesized setter will retain the instance you pass it, which is never released explicitly. You can remedy this by using autorelease

 self.navigationItem.backBarButtonItem = 
      [[[UIBarButtonItem alloc] initWithTitle:@"Custom Title" 
         style:UIBarButtonItemStyleBordered
         target:nil
         action:nil] autorelease];  //<-- autoreleased

Or you could point a variable at the instance so you can explicitly release it later:

UIBarButtonItem* item = ...
self.navigationItem.backBarButtonItem = item;
[item release];

Hope this helps!

Solution 9 - Ios

- (void)viewDidLoad {
  [super viewDidLoad];

  UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:@"Back" style:UIBarButtonItemStylePlain target:nil action:nil];
  self.navigationItem.backBarButtonItem = backButton;
  [backButton release];
}

Solution 10 - Ios

I've discovered something interesting. If you subclass the UINavigationController and override the pushViewController:animated: method and do something like this: (bear in mind that I'm using ARC)

UIBarButtonItem *backButton = [[UIBarButtonItem alloc] 
 initWithTitle: @"Back" 
 style: UIBarButtonItemStyleBordered
 target: nil action: nil];

viewController.navigationItem.backBarButtonItem = backButton;

[super pushViewController:viewController animated:animated];

Then for all ViewControllers that are pushed with your navigation controller will have the "Back" button in them automatically. If you want to change the text for certain view controllers you can try and maybe cast the viewcontroller to a certain class or your own custom protocol (which your viewcontroller inherits from which could have a method like backButtonText or something silly like that) which can give you certain information on the viewcontroller that's coming in sothat you can customize the back button text for it. Now the back button text is taken care of in a place which should hold the responsibility solely. I have to admit that creating a new button to change the text sucks, but oh well.

Can anyone think of a reason why not to do it like this? Atleast you don't have to fiddle with viewcontroller titles or have to remember to create a new back button before pushing the viewcontroller on the navigation controller.

Solution 11 - Ios

Expanding on Aubrey's suggestion, you can do this in the child view controller:

create two variables for storing the old values of the parent's navigationItem.title and the parent's navigationItem

UINavigationItem* oldItem;
NSString* oldTitle;

in viewDidLoad, add the following:

oldItem = self.navigationController.navigationBar.topItem;  
oldTitle = oldItem.title;  
[oldItem setTitle: @"Back"];  

in viewWillDisappear, add the following:

[oldItem setTitle: oldTitle];  
oldTitle = nil;  // do this if you have retained oldTitle
oldItem = nil;   // do this if you have retained oldItem

It's not perfect. You will see the the title of the parent view change as the new controller is animated in. BUT this does achieve the goal of custom labeling the back button and keeping it shaped like a standard back button.

Solution 12 - Ios

rein's answer works well.

Note that if you push more than one view controller, the changed back button title will appear for each of them, which may not be what you want.

In that case, you'll need to create the custom UIBarButtonItem each time you push a view controller.

Also, make sure you do it before pushing the view controller, otherwise you will get a screen hiccup as the title changes.

Solution 13 - Ios

Put this into you viewDidLoad, hope it will result into what you are looking for

UIBarButtonItem *backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Close" 
style:UIBarButtonItemStylePlain target:nil action:nil];
self.navigationItem.backBarButtonItem = backBarButtonItem;
[backBarButtonItem release];

Solution 14 - Ios

if You want to set title in ARRIVING controller (sometimes more logic..) in swift 3 do:

func setBackButtonNavBar(title: String, delay: Double){
	
	let when = DispatchTime.now() + delay
	DispatchQueue.main.asyncAfter(deadline: when, execute: { () -> Void in
		
		if let navBar = self.navigationController?.navigationBar{
			navBar.backItem?.title = title
		}
	})
	
}

in upcoming controller:

override func viewDidLoad() {
	super.viewDidLoad()
	self.setBackButtonNavBar(title: "back", delay: 0.3)
}

usually I put self.setBackButtonNavBar in a controller extension.

Solution 15 - Ios

I know this is an old question and the answers' kind of out updated!

The easy way is to do this in parent ViewController:

i.e the one that takes you to next view controller.

self.navigationItem.backBarButtonItem  = UIBarButtonItem(title: "Custom text here", style: .plain, target: nil, action: nil)

Solution 16 - Ios

Doing this in code remove the back button style of the UINavigationConroller. If you add a Navigation Item in each of yours views, you can set the title of the back botton in the StoryBoard.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionAli ShafaiView Question on Stackoverflow
Solution 1 - IosreinView Answer on Stackoverflow
Solution 2 - IosPetr PellerView Answer on Stackoverflow
Solution 3 - IosTrangView Answer on Stackoverflow
Solution 4 - IosAubrey GoodmanView Answer on Stackoverflow
Solution 5 - IosAddisDevView Answer on Stackoverflow
Solution 6 - IosvalvolineView Answer on Stackoverflow
Solution 7 - IosalonesView Answer on Stackoverflow
Solution 8 - IosEric GView Answer on Stackoverflow
Solution 9 - IosLCANTView Answer on Stackoverflow
Solution 10 - IosDandréView Answer on Stackoverflow
Solution 11 - IosFingerTipFunView Answer on Stackoverflow
Solution 12 - IosnorthernmanView Answer on Stackoverflow
Solution 13 - IosRavi_ParmarView Answer on Stackoverflow
Solution 14 - IosingcontiView Answer on Stackoverflow
Solution 15 - IosmadenyView Answer on Stackoverflow
Solution 16 - IosgjseminarioView Answer on Stackoverflow