NavigationController 后退按钮直到加载视图后才出现

NavigationController back button not appearing until after view loaded

我有两个视图控制器,第一个嵌入在导航控制器中。第一个视图上的一个按钮将第二个按钮推到导航堆栈上。伟大的。除了后退按钮仅在第二个视图完全完成动画到 window 时才会出现。这很好,只是该视图的标题会立即显示:

这造成了一种奇怪的差异,其中一个元素立即出现,而另一个元素随后才出现。有什么办法让后退按钮立即出现?我正在使用自定义按钮顺便说一句:

let backButton = UIBarButtonItem(title: "Cancel", style: UIBarButtonItemStyle.Plain, target: self, action: nil)

navigationItem.backBarButtonItem = backButton

在不了解更多细节的情况下,我不确定您所描述的行为背后的原因。但是,我将尝试介绍如何设置这些类型的过渡。由于您在故事板中工作,因此非常简单。

在故事板中,您将从嵌入导航控制器的视图控制器和要过渡到的第二个视图控制器开始。 Control-drag 从第一个 VC 的按钮到第二个 VC 场景,然后选择一个 "Show" 动作 segue,这将导致导航推送转换 - 我认为这就是方式您已经配置好故事板。

您可以直接在故事板中更改后退按钮标题。从左侧的文档大纲中选择第一个 VC 场景和 select 它的导航项 object。在右侧的属性检查器中,只需将 "Back Button" 字段更改为您希望按钮在按下第二个 VC 时显示的任何内容。这将保留用户期望的后退箭头图标。

如果您想使用推送过渡但显示 normal-looking 按钮但没有箭头,您可以在第二个 VC 的 viewDidLoad() 中隐藏后退按钮:

navigationItem.hidesBackButton = true

然后,回到故事板中,将一个栏按钮项目拖出到第二个 VC 的导航栏左侧,并为其指定自定义标题等。

但是,您真正想要的是此设置的模式转换,而这样做就像在故事板中将您的转场类型更改为 "Present Modally" 一样简单。这将在导航堆栈 上方显示第二个 VC ,因此默认情况下不会显示导航栏。与其从 objects 面板中拖出一个独立的导航栏(这会让您在尝试将其扩展到状态栏下方时感到头疼),不如将您的第二个 VC 嵌入到它自己的导航控制器中将隐式添加一个导航栏。然后,您可以将栏按钮项拖出到栏的左侧并通过展开转场将其连接起来,或者使用 IBAction 方法并调用 presentingViewController?.dismissViewControllerAnimated(_:completion:).