在导航栏中自动添加“返回”按钮
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 的解释),所以如果你回去,你必须重新设置一切。
【讨论】:
以上是关于在导航栏中自动添加“返回”按钮的主要内容,如果未能解决你的问题,请参考以下文章