我有一个令人难以置信的令人沮丧的问题似乎是一个错误,但我很难相信没有其他人遇到这个问题。我的应用程序的根视图控制器是一个UITabBarController,其中每个选项卡都是UINavigationController。一切都很好。
现在我来到了一个我想要编辑堆栈的地方,所以我重新安排了当前导航控制器的viewControllers,然后执行:
[self.navigationController setViewControllers:newViewControllers animated:YES];
堆栈被正确弹出/推送到顶视图控制器,但导航栏不会更新到当前视图控制器,并且似乎与popCon之前的viewController完全一样。如果我这样做:
[self.navigationController popToViewController:someViewController animated:YES];
一切都很完美。有没有人曾经遇到过这个?有解决方法吗?我做错了什么?
答案 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];
这可能会对你有所帮助。