我遇到了一个令人沮丧的令人沮丧的问题,似乎是一个错误,但是我很难相信其他人都没有遇到过这个问题。我的应用程序的根视图控制器是UITabBarController,其中每个选项卡都是UINavigationController。一切正常。
现在我来到一个要编辑堆栈的地方,所以我重新排列了当前导航控制器的viewControllers,然后执行:
[self.navigationController setViewControllers:newViewControllers animated:YES];
堆栈已正确弹出/推入顶部视图控制器,但导航栏未更新为当前视图控制器,并且看起来与弹出之前使用viewController时完全一样。如果我这样做:
[self.navigationController popToViewController:someViewController animated:YES];
一切正常。有人遇到过吗?有解决方法吗?我做错了吗?
我遇到了同样的问题,看来苹果公司没有纠正该错误,因此,该线程的选定答案似乎不正确。我设法使用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
替换以前的控制器。
希望这会有所帮助。
Apple似乎已在最新的SDK中修复了此问题
两个同样难看的解决方法。
首先,如果:
[self.navigationController popToViewController:someViewController animated:YES];
效果很好,请尝试将一个额外的viewcontroller推入堆栈,然后调用:
[self.navigationController popToViewController:someViewController animated:NO];
意思是您应该在没有任何动画的情况下进入所需的vc。
第二,
在设置堆栈之前,设置leftButtonBarItem = nil;有效地删除旧的视图控制器的按钮。实际上,如果标题错误,也可以进行更改。
都不是很干净,但可能会为您带来预期的结果。
您还可以将根视图控制器设置为UINavigationController的委托,例如:
@interface YourViewController : UIViewController <UINavigationControllerDelegate> {
然后在didShowViewController委托方法中,手动设置可用的视图控制器:
-(void)navigationController:(UINavigationController*)navigationController didShowViewController:(UIViewController*)viewController animated:(BOOL)animated {
[[viewController navigationController] setViewControllers:[[viewController navigationController] viewControllers]];
}
让我知道这是否适用于您的环境!
我仍然在Xcode 9.4.1和iOS 11.4中遇到此问题。
最简单的方法是为导航堆栈中的所有先前视图控制器调用loadViewIfNeeded()
:
let menuViewController = ...
menuViewController.loadViewIfNeeded()
let submenuViewController = ...
navigationController.setViewControllers([menuViewController, submenuViewController], animated: true)
[self.navigationController setViewControllers:newViewControllers animated:NO];
这可能对您有帮助。