在导航栏中自动添加“返回”按钮

Posted

技术标签:

【中文标题】在导航栏中自动添加“返回”按钮【英文标题】:Automatically add "back" button in navigation bar 【发布时间】:2019-04-10 15:40:25 【问题描述】:

首先:我使用 Swift 5 和 Xcode 10 (ios 12.0)。

我是 Swift/iOS 开发的新手,观看了一些关于如何向导航栏添加“后退”按钮的视频。在所有这些中(使用 Swift 3),在添加 segue(在第一个场景和第二个场景中的项目之间)和两个导航栏的标题后,一旦应用程序运行,按钮就会神奇地出现。

我的应用有三个 ViewController/场景:

    不使用导航栏登录(“登录”按钮:转到场景 2) 表格视图(使用 segue 链接到场景 3,因此我只需点击列表中的一个项目) 表格视图中单个项目的更多信息

场景 2 和 3 之间的 segue 设置为“显示(例如推送)”,因为“推送”已被弃用并导致应用程序崩溃。

我手动将两个导航栏添加到导航控制器(2 和 3)中,并希望在场景 3 的导航栏中添加一个箭头图标。到目前为止我已经尝试过:

为两个场景中的导航栏添加标题 设置“后退按钮”属性(导航栏文本),从而创建了一个子对象 然后设置子对象的“图片”属性 将“Back”和“Back Mask”属性(导航栏)设置为同一张图片

但是,Xcode 和模拟器(甚至图像)都没有显示。

是否仍然可以获得自动“返回”按钮,或者您现在必须使用“条形按钮项”自己添加它?

【问题讨论】:

【参考方案1】:

因此,当您 show 一个视图控制器(例如您的 v2、v3)时,这些视图控制器不再与您的 v1 在同一个导航堆栈中,这就是它不会自动显示后退按钮的原因。

我不知道为什么它说您的推送功能已被弃用,但如果您可以截屏,也许我可以给您一个原因。我正在使用 Swift5,我可以使用它:self.navigationController?.pushViewController(vc, animated: true)

要回答您的问题,如果您想向 v2、v3 添加后退按钮,那么您必须使用 BarButtonItem,然后调用 self.dismiss(viewController, true) 如果您的意图是将它们放在与 v1 相同的导航堆栈中,我强烈建议您不要这样做。

【讨论】:

我明白了,谢谢你的解释。 Xcode 10(segue,属性视图)中的“Kind”列表在“Deprecated Segues”下列出了“Push”和其他几个,所以我宁愿不使用它,以防它在不久的将来被删除。另外,当我尝试使用它时,该应用程序崩溃了。 V1 是登录屏幕,只显示一次,但我想经常快速地在 v2 和 v3 之间切换。我可以使用 BarButtonItem 和“显示”,我只是想知道在我设置所有内容之前是否还有一种自动方式,如果我经常加载/卸载视图是否会出现性能问题。跨度> 什么是“返回”属性甚至用于(导航栏和导航栏文本)? 抱歉,另一条评论:我刚刚使用通过“show”segue 连接到 v2 的 BarButtonItem 对其进行了测试,而 v2 中的 ListView 为空。 V1 为 v2 提供了一个项目数组来填充列表,但 v3 当然没有这样做,看起来“显示 v3”完全破坏了 v2。所以最后我确实需要一些只隐藏 v2 而不会破坏它的东西,所以我不必再次在 v2 中设置所有内容。编辑:看起来“推送”自 iOS8 以来已被弃用(我使用的是 iOS12)。 我明白了。所以 v1(login screen) 可以单独作为一个视图控制器,如果它不需要在导航中,则排除它。而不是“显示(例如推送)”,我会将从 v1 到 v2 的导航控制器的转场设置为“以模态方式呈现。确保 v2 在导航控制器中。然后使用“显示(例如推)创建另一个从 v2 到 v3 的转场"。一旦选择了 v2 列表中的项目,执行您刚刚创建的 segue。在 v3 中,将自动显示返回到 v2 的按钮。关键是不要离开导航控制器。 当你创建一个自定义的bar item按钮时没有返回属性,你通常喜欢关闭一个视图或者倒退到前一个视图。出于性能方面的考虑,请将其保存在导航控制器中。如果您需要进一步的帮助,我可以为您创建一个示例项目。【参考方案2】:

回答我自己的问题:是的,仍然可以(Xcode 10/Swift 5)让它自动添加一个“后退”按钮。

Push segues 自 iOS 8 起已弃用,因此请改用 Show (e.g. Push)

通常Show (e.g. Push) segue 使用Show,但如果在当前ViewController 的左侧(场景从左到右)的某处有NavigationController,它会自动使用Push,这也会添加一个“返回”按钮到下一个场景的 NavigationBar,或者,如果没有 NavigationBar,它只是将按钮添加到该栏通常所在的位置。

我的场景现在看起来像这样:

    ViewController1:不使用 NavigationBar 登录(“登录”按钮:转至 NavigationController) NavigationController:自动切换到新的UITableViewController(如果通过库添加) ViewController2:表格视图(链接到 4. 使用 segue) ViewController3:单个项目的更多信息

将数据添加到 1. 和 3.(使用 2.)之间的 segues 的处理方式与没有 NavigationController 时的处理方式略有不同:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) 
    let navC = segue.destination as? UINavigationController
    let vc2 = navC?.viewControllers.first as! ViewController2
    vc2.myinformation = myinfosArray

(不好)NavigationController 的替代方案:

添加一个NavigationBar 和一个BarButtonItem 并将其链接到上一个视图,就像使用任何其他按钮一样。

缺点:一旦切换到下一个视图(在我的情况下为“ViewController2”)就会重置(因为两个视图不在同一个堆栈上,请参阅上面 jaelee 的解释),所以如果你回去,你必须重新设置一切。

【讨论】:

以上是关于在导航栏中自动添加“返回”按钮的主要内容,如果未能解决你的问题,请参考以下文章

如何在导航栏中添加返回按钮箭头功能

将目标添加到导航栏中的库存返回按钮

如何在导航栏中添加右键?

如何在导航栏中添加多个栏按钮

无法在故事板iOS8的导航栏中添加右栏按钮

在导航栏中添加彩色图像作为右栏按钮项