UINavigationController setViewController:animated:导航栏困难

问题描述 投票:8回答:6

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

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

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

堆栈已正确弹出/推入顶部视图控制器,但导航栏未更新为当前视图控制器,并且看起来与弹出之前使用viewController时完全一样。如果我这样做:

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

一切正常。有人遇到过吗?有解决方法吗?我做错了吗?

iphone uiviewcontroller uinavigationcontroller
6个回答
10
投票

我遇到了同样的问题,看来苹果公司没有纠正该错误,因此,该线程的选定答案似乎不正确。我设法使用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替换以前的控制器。

希望这会有所帮助。


2
投票

Apple似乎已在最新的SDK中修复了此问题


1
投票

两个同样难看的解决方法。

首先,如果:

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

效果很好,请尝试将一个额外的viewcontroller推入堆栈,然后调用:

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

意思是您应该在没有任何动画的情况下进入所需的vc。

第二,

在设置堆栈之前,设置leftButtonBarItem = nil;有效地删除旧的视图控制器的按钮。实际上,如果标题错误,也可以进行更改。

都不是很干净,但可能会为您带来预期的结果。


0
投票

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

@interface YourViewController : UIViewController <UINavigationControllerDelegate> {

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

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

让我知道这是否适用于您的环境!


0
投票

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

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

let menuViewController = ...
menuViewController.loadViewIfNeeded()

let submenuViewController = ...

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

-2
投票
[self.navigationController setViewControllers:newViewControllers animated:NO];

这可能对您有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.