Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

UINavigationController setViewController:animated: navigation bar difficulties

I'm having an incredibly frustrating problem that appears to be a bug, but I have a very hard time believing no one else has come across this. My application's root view controller is a UITabBarController, where each tab is a UINavigationController. Everything works great.

Now I've come to a place where I want to edit the stack, so I rearrange the viewControllers of the current navigation controller and then do:

[self.navigationController setViewControllers:newViewControllers animated:YES];

The stack is correctly popped/pushed to the top view controller, but the navigation bar does not update to the current view controller and seems to remain exactly as it did with the viewController before the pop. If I do:

[self.navigationController popToViewController:someViewController animated:YES];

Everything works perfectly. Has anyone ever come across this before? Is there a workaround? Something I'm doing wrong?

like image 685
beinstein Avatar asked Jan 06 '10 01:01

beinstein


3 Answers

I faced the same problem, it seems that Apple haven't corrected that bug and as a result the selected answer of this thread appears to be incorrect. I managed to correct this problem using this bug report as in the comment of Anurag combined with the comment of Scott Pfeil.

Here is the code :

navController.navigationBarHidden = YES;

NSArray* viewControllers =  navController.viewControllers;
UIViewController* currentController = [viewControllers objectAtIndex:viewControllers.count-1];

NSArray *controllers = [NSArray arrayWithObjects: viewController , currentController , nil];

[navController setViewControllers:controllers animated:NO];

navController.navigationBarHidden = NO;

I call this code in the viewDidLoad of the currentController and what I did is replace the previous controllers with only viewController.

Hope this helps.

like image 137
Quentin G. Avatar answered Nov 20 '22 11:11

Quentin G.


Apple appears to have fixed this in the newest SDK

like image 45
beinstein Avatar answered Nov 20 '22 12:11

beinstein


Two equally ugly work arounds.

First, If:

[self.navigationController popToViewController:someViewController animated:YES];

Works well, try pushing an extra viewcontroller on the stack and then call:

[self.navigationController popToViewController:someViewController animated:NO];

Meaning you should get to the vc you want without any animation.

Second,

Before setting the stack, set the leftButtonBarItem = nil; Effectively removing the old view controller's button. In fact if the title is wrong, change that too.

Neither is exactly clean but may get you the desired results.

like image 22
Corey Floyd Avatar answered Nov 20 '22 11:11

Corey Floyd