使用 UINavigationController 推送两个视图后后退按钮消失

Posted

技术标签:

【中文标题】使用 UINavigationController 推送两个视图后后退按钮消失【英文标题】:Back button disappears after pushing two views using UINavigationController 【发布时间】:2012-03-05 15:46:42 【问题描述】:

我目前正在使用 UINavigationController 开发应用程序。我将根视图控制器设置为 ViewController1,然后推送 ViewController2 和 ViewController3 以响应按钮单击事件。

如果我随后单击视图 3 中的后退按钮,我将返回到视图 2,但此视图没有后退按钮。同样有趣的是,为每个视图设置了标题(分别为“视图 1”、“视图 2”和“视图 3”),如果我使用后退按钮从视图 3 导航回视图 2,标题将变为“视图 1' 即初始视图(视图 1)的标题 - 不是视图 2 的标题。

如果有人知道这里可能发生了什么,非常感谢您的建议。

非常感谢!

编辑:我使用以下代码在应用委托中初始化 UINavigationController:

self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen] bounds]];
self.viewController1 = [[ViewController1 alloc] init];
self.viewController2 = [[ViewController2 alloc] init];
self.viewController3 = [[ViewController3 alloc] init];
self.navigationController = [[UINavigationController alloc] initWithRootViewController:viewController1];
self.window.rootViewController = self.navigationController;

我稍后在按钮点击时将视图控制器推送到 UINavigationController,如下所示:

MyAppDelegate *appDelegate = (MyAppDelegate*)[[UIApplication sharedApplication] delegate];
[self.navigationController pushViewController:appDelegate.viewController2 animated:YES];

【问题讨论】:

你能贴一些代码吗?另外,“从 3 导航到 2”是指使用后退按钮吗?还是您使用其他方法? 嗨 Damo - 是的,我使用后退按钮从 3 导航到 2。我编辑了我的原始帖子以包含我用于推送视图控制器的代码。谢谢。 那么在 viewController 对象中你是否设置了一个左侧导航栏按钮项 - 比如 - self.navigationItem.backBarButtonItem = summat?您说有一个后退按钮,但它似乎消失了 - 对吗? 不,我现在让 UINavigationController 处理这个。如果我从根视图控制器 (viewController1) 移动到 viewController2,那么视图 2 上会显示一个后退按钮。如果我从 viewController2 移动到 viewController3,那么视图 3 上也会显示一个后退按钮。只有当我使用后退按钮时视图 3 返回到后退按钮未显示的视图 2(在视图 2 上)。 出于兴趣 - 这些视图控制器的 @propertrty 声明看起来如何?他们确定保留吗? (尤其是根 - 因为那似乎是迷路了) 【参考方案1】:

我找到了解决方案 - 在 vi​​ewController2 和 viewController3 中,我使用以下代码来隐藏导航栏(我希望导航栏隐藏在 view1 上,然后在视图 2 和 3 上可见)。

- (void) viewWillAppear:(BOOL)animated

    [self.navigationController setNavigationBarHidden:NO animated:animated];
    [super viewWillAppear:animated];


- (void) viewWillDisappear:(BOOL)animated

    [self.navigationController setNavigationBarHidden:YES animated:animated];
    [super viewWillDisappear:animated];

我意识到在 viewController1 中执行相反的操作更有意义,即

- (void) viewWillAppear:(BOOL)animated

    [self.navigationController setNavigationBarHidden:YES animated:animated];
    [super viewWillAppear:animated];


- (void) viewWillDisappear:(BOOL)animated

    [self.navigationController setNavigationBarHidden:NO animated:animated];
    [super viewWillDisappear:animated];

然后从视图控制器 2 和 3 中删除之前的代码。这解决了问题。

【讨论】:

以上是关于使用 UINavigationController 推送两个视图后后退按钮消失的主要内容,如果未能解决你的问题,请参考以下文章

UINavigationcontroller 中未使用的视图会发生啥?

使用 push segue 时 UINavigationController 是不是强制

UINavigationController - 使用 UIBlurEffect 清除背景

一起使用 UITabBarController 和 UINavigationController

iPhone - UINavigationController - 使用 CATransaction 自定义动画

如何在 SwiftUI 中使用 UINavigationController