连续推送视图控制器时缺少导航或后退按钮标题

Posted

技术标签:

【中文标题】连续推送视图控制器时缺少导航或后退按钮标题【英文标题】:Missing Navigation's or Back Button's Title When Push ViewControllers in Succession 【发布时间】:2015-10-28 09:26:36 【问题描述】:

我在UINavigationController 连续推送视图控制器时遇到问题。

有关信息,我使用 XCode 7.0,针对 ios 8 构建,以及在 Simulator 9.0 上运行的应用程序。

这是用户手动点击 tableview 的单元格时的视图:

如上图所示,导航和后退按钮的标题正常渲染。

但是当我以编程方式执行此操作时,像这样(stackUIViewController 的数组):

for controller in stack 
    self.mainNavController.pushViewController(controller, animated: false)

或像这样使用 0.0 秒的延迟:

for controller in stack 
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, Int64((0.0 * Float(NSEC_PER_SEC)))), dispatch_get_main_queue(), 
        self.mainNavController.pushViewController(controller, animated: false)
    )

它会显示这样的最终结果(左边是无延迟,右边是有延迟):

请注意左侧屏幕截图中缺少导航标题(无延迟)和右侧屏幕截图中缺少返回按钮标题(有延迟)。

这个问题困扰了我好几天。知道为什么会这样吗?有谁知道如何解决这一问题?或者至少,解决这个问题?

提前致谢。

【问题讨论】:

你能分享你初始化并添加栏按钮项的代码吗? 您找到解决方法了吗?仍在使用 iOS 13.3 不。还是没有找到解决办法。只是一个解决方法。最后,我用我自己的栏按钮项覆盖了后退按钮,类似于下面接受的答案。 实际上对此进行了更多思考,我相信这可能是预期的行为。如果您手动打开第二个视图控制器,您将已经初始化并在屏幕上显示您的第一个视图控制器,因此它的导航将被设置。然后当第二个 vc 被推送时,导航控制器将使用第一个 vc 的导航项来显示返回按钮。但是,如果您以编程方式执行此操作,则第一个 vc 未初始化,并且导航控制器没有导航项可从中获取返回标题。 另外,鉴于 UINavigationController 函数 setViewControllers:animated,您不应该使用循环推送视图控制器 【参考方案1】:

这是我过去所做的。您可能会发现它很有帮助:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) 
    let myBackButton = UIBarButtonItem()
    myBackButton.title = "This is my back button"
    navigationItem.backBarButtonItem = myBackButton

【讨论】:

嗯......虽然你的回答没有解决问题,但你给了我一个提示,所以我完全删除了后退按钮标题(只留下' 【参考方案2】:

发生这种情况是因为中间视图控制器没有被告知加载,因此它无法正确加载内容,例如返回按钮的正确消息。对于任何中间视图控制器,调用 loadViewIfNeeded(),然后上层视图控制器可以从中获取所有需要的信息。

【讨论】:

以上是关于连续推送视图控制器时缺少导航或后退按钮标题的主要内容,如果未能解决你的问题,请参考以下文章

在导航控制器中添加标签栏控制器时隐藏后退按钮

在 iOS 13 上推送新视图后后退按钮崩溃

iOS 5中缺少navigationController栏后退按钮

如何本地化后退按钮?

不同导航视图控制器上的后退按钮不同

无法让默认 UINavigationController 后退按钮工作