Well, figuring such thing was easy, I decided to get a custom action executed by my UIBarButtonItem once it's pressed. Here's the code:
UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:#"GET BACK!!!" style:UIBarButtonItemStylePlain target:self action:#selector(test)];
self.navigationItem.backBarButtonItem = backButton;
[backButton release];
[self.navigationController pushViewController:appsViewController animated:YES];
Yet, even without adding any custom views, -test isn't called at all (although the title change is applied).
As you can see, I'm applying these changes to the item right before I push the new view controller (else the title change wouldn't even work).
I've searched a lot for an answer to this, but the only trouble people seem to be having is it not replying to an action once it has a custom view. So; what am I doing wrong?
You can't set custom actions on back buttons. (Or, rather the action of the back button item is set to a internal one that does the back-behaviour.) If you want to do something when the user comes back to your view controller, consider doing it in viewWillAppear:. You might need to keep track of whether you're appearing after pushing a child view controller or appearing the first time, etc.
The back bar button item just allows you to configure the title to appear in the back button - it isn't stated in the docs but I think that, like a custom view, a custom action is ignored. It just pops the view controller.
Any button that looks like a back button and is in the left of the navigation bar should pop the top view controller from the stack. If you want to do anything else, use the left button item of the top view, or hook into the view will appear / disappear methods or the navigation controller delegate.
Related
I'm trying to change the text of the back button from within Interface Builder, but when I select the Navigation Bar and go into the Attributes Inspector and set the Back Button text to "Close" it still shows up with the title of the previous view.
How do I get this to work?
The back button will always show the previous UIViewController title or backBarButtonItem defined.
So if you have "view1" and move to "view2" you need to set the backButton in "view1" so it's displayed correctly while "view2" is presented.
(In other word "view1" is responsible to provide what should be displayed in a back button that point to it)
In this way if "view1" is follow by any views all those will have the correct back button.
Try this in -(void)viewDidload, as this method is fired after the nib has loaded:
UIBarButtonItem *backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:#"Close" style:UIBarButtonItemStylePlain target:nil action:nil];
self.navigationItem.backBarButtonItem = backBarButtonItem;
[backBarButtonItem release];
A quick and dirty trick is to set the "title" to what name you want in the button in the willDisappear override in the view controller. Make sure to set the "title" back to the correct name on the willAppear override view controller. One drawback with this technique is that on slower units you can see it change. On iPhone 4 and later it's hardly noticeable.
Hope this helps.
Here is what I did, this is a dynamic questionary application;
-Created a UINavigationBased application
-Created some new UIVIewController subclasses with their xib's and designed them.
-I opened mainwindow.xib and set the navigationcontroller to has a navigation bar and a toolbar in black.
-So now when I switch back and forth between views by pushing them with the navigation controller I can see that shared toolbar and a navigationbar in every page with a backbutton, which is cool.
some of my uiviews are tableviews and some are textboxes
What I want is I want to put a "next" button on that toolbar and be able to go through my views but not with getting the row tap. With each next click I will decide which view to push.
How can I put this "shared" button? and in which class can I define its functionality? also I want to make it sometimes invisible for instance on first page and on last page of questionary.
In every page that you want to have a next button add this in the init or viewDidLoad
UIBarButtonItem *rightButton = [[UIBarButtonItem alloc] initWithTitle:#"Next"
style:UIBarButtonItemStylePlain
target:self
action:#selector(pushNextView)];
self.navigationItem.rightBarButtonItem = rightButton;
[rightButton release];
Now just implement pushNextView method to push what ever view you want
-(void)pushNextView{
//push next view
}
Edit
By specifying the target of your rightButton to AppDelegate (right now it points to self) you can setup the pushNextView method in your AppDelegate and manage all your views there.
I have a UINavigation bar in a few of my views without using a UINavigationController. So i dont use the navigation controller to push new views, I load new views again which have a "static" UINavigationBar at the top.
So currently the navigation bars just show the title of which ever view the user is looking at, they have no other function.
In some of my views I have a requirement to have a back button, about 3 views out of 10.
So I was wondering if it is possible for me to insert a back button that states back and goes back to the previous screen for just these 3 views, so I would have to be able to insert the back button and also detect when it was pressed.
Can I do this with my current set up or do I need to go back and create a view with a UINavigationController and use that to push and pop my views and somehow suppress the back button on the 7 screens that I dont want it to display on?
EDIT:
I've tried the following way:
UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:#"Back" style:UIBackButtonItemStyleBorder target:nil action:selector(myaction)];
[navItem setBackBarButtonItem:backButton]; //Doesn't work
[navItem setLeftBarButtonItem:backButton]; //Works but lacks the back arrow style of the back button
[backButton release];
So I can add a button but it doesn't look like the back button, is there a way to make it look like the back button or should I scratch and just use a UINavigationController? And if I do how can I suppress the back button when I dont want one?
You can if i get you correctly. Just add a custom button to the navigation as leftBarButtonItem or backBarButtonItem and give it a custom button press action. in the button method you can remove this view and show your previous view. But that said the better way is to use normal UINavigationController if your app has Navigation bar in all screens.
Greetings,
I have the following code for capturing the back button's event:
[self.navigationItem setBackBarButtonItem:[[UIBarButtonItem alloc] initWithTitle:#"Logout" style:UIBarButtonItemStylePlain target:self action:#selector(doLogout:)]];
And here is my doLogout:
-(void) doLogout:(id)sender{
NSLog(#"hi");
}
Everything compiles and runs fine, and the back button text is changed to "Logout".
The only problem is that my doLogout function is never called!!!
What can I do? I've been stuck on this for an hour now... ;(
Many thanks in advance,
The official doc:
When this item is the back item of the navigation bar—when it is the next item below the top item—it may be represented as a back button on the navigation bar. Use this property to specify the back button. The target and action of the back bar button item you set should be nil. The default value is a bar button item displaying the navigation item’s title.
Instead of trying to catch "back button event" why no just just try overriding UIViewController viewDidUnload?
Instead of setting backBarButtonItem on the top view controller, what you could do is set the leftBarButtonItem on the child view controller. This can be any arbitrary bar button item and all action messages should be delivered as normal. Because this takes place of the back button, you have to make sure you manually pop the child controller in one of the action methods.
I have a reference to a "UIBarButtonItem", is there a way I can add a custom "Back Navigation Button" to that item when it is not part of a Navigation based view?
I can add a left button:
UIBarButtonItem *backButton = [[UIBarButtonItem alloc]
initWithTitle:#"Custom Back"
style:UIBarButtonItemStylePlain target:self
action:#selector(backAction:)];
menuItem.backBarButtonItem = backButton; //This doesn't seem to work.
menuItem.popOverNavigationItem.leftBarButtonItem = backButton; //This shows a normal button
So how could I make the leftmost button look like a back navigation button?
UPDATE: This other question answered the root of my problem that was leading me to try and do this non-standard UI setup:
iPad: Merge concept of SplitViewController and NavigationController in RootView?
I think the correct way to set the back button is to set it for the view controller that you would be going back to. For example:
RootViewController > DetailViewController
If you want the back button to say "Custom Back" whilst you're on DetailViewController, you have to actually set RootViewController's back button to "Custom Back".
Hope that makes sense.
Having just struggled with this: I think the answer is “no.” You'll need a controller hierarchy.