UINavigationController setViewController:动画:导航栏困难

时间:2010-01-06 01:29:57

标签: iphone uiviewcontroller uinavigationcontroller

我有一个令人难以置信的令人沮丧的问题似乎是一个错误,但我很难相信没有其他人遇到这个问题。我的应用程序的根视图控制器是一个UITabBarController,其中每个选项卡都是UINavigationController。一切都很好。

现在我来到了一个我想要编辑堆栈的地方,所以我重新安排了当前导航控制器的viewControllers,然后执行:

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

堆栈被正确弹出/推送到顶视图控制器,但导航栏不会更新到当前视图控制器,并且似乎与popCon之前的viewController完全一样。如果我这样做:

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

一切都很完美。有没有人曾经遇到过这个?有解决方法吗?我做错了什么?

6 个答案:

答案 0 :(得分:6)

我遇到了同样的问题,似乎Apple没有纠正这个错误,因此这个帖子的选定答案似乎是不正确的。 我使用this bug report设法纠正了这个问题,如Anurag的评论和Scott Pfeil的评论一样。

以下是代码:

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;

我在currentController的viewDidLoad中调用此代码,我所做的就是用viewController替换以前的控制器。

希望这有帮助。

答案 1 :(得分:2)

Apple似乎已在最新的SDK

中解决此问题

答案 2 :(得分:1)

两个同样丑陋的工作。

首先, 如果:

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

运行良好,尝试在堆栈上推送额外的viewcontroller,然后调用:

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

意思是你应该在没有任何动画的情况下进入你想要的vc。

其次,

在设置堆栈之前,设置leftButtonBarItem = nil; 有效删除旧视图控制器的按钮。事实上,如果标题错了,也可以改变它。

两者都不是很干净,但可能会得到你想要的结果。

答案 3 :(得分:0)

您还可以将根视图控制器设置为UINavigationController的委托,如:

@interface YourViewController : UIViewController <UINavigationControllerDelegate> {

然后在didShowViewController委托方法中手动设置可用的视图控制器:

-(void)navigationController:(UINavigationController*)navigationController didShowViewController:(UIViewController*)viewController animated:(BOOL)animated {
    [[viewController navigationController] setViewControllers:[[viewController navigationController] viewControllers]];
}

请告诉我这是否适用于您的环境!

答案 4 :(得分:0)

我仍然在 Xcode 9.4.1 iOS 11.4 中遇到此问题。

最简单的方法是为导航堆栈中的所有先前视图控制器调用loadViewIfNeeded()

let menuViewController = ...
menuViewController.loadViewIfNeeded()

let submenuViewController = ...

navigationController.setViewControllers([menuViewController, submenuViewController], animated: true)

答案 5 :(得分:-2)

[self.navigationController setViewControllers:newViewControllers animated:NO];
这可能会对你有所帮助。