ios - 将 segue 展开到以编程方式指定的 unwindSegue(无情节提要)
问题描述
在查看了类似问题的许多答案后,我仍然没有答案,例如。https://stackoverflow.com/questions/12509422/how-to-perform-unwind-segue-programmatically
我想尝试重申“以编程方式”对我提出的问题意味着什么。
所有解决方案都显示使用故事板并将视图控制器“退出”连接到某些视图控制器中定义的展开方法。这可行,但不是以编程方式,而是通过 Xcode 工具的使用直接连接。确保准备方法以编程方式参与最后的步骤。
我的挑战是我将 Cocoapods 用作可重用的库,而故事板无法了解该库的用户。所以他们不能连接到一个 unwind 方法,因为还没有一个。
我想使用语言通用功能以编程方式(Swift 或 Objective-C)指定展开方法。
unwind 方法也可能在另一个包中,使事情变得更加复杂。
注意:创建一个占位符展开是可以的,假设视图控制器名称的值可以通过 UIStoryboardSegue 对象(它有一个unwindAction)以编程方式更改。
感谢您的任何见解。
更新答案(它不会让我回答)首先,我的回答涉及澄清原始问题,特别是“没有 storboard”声明。这是为了“展开”到未通过情节提要指定的 ViewController,特别是该库的新用户。我的回答表明我可以做到这一点,但仍然需要一个故事板(只是不适用于这个新的 ViewController)。
我的问题确实表明可以通过情节提要创建占位符展开。
注意:创建一个占位符展开是可以的,假设视图控制器名称的值可以通过 UIStoryboardSegue 对象(它有一个 unwindAction)以编程方式更改。
所以我的答案可以调用未通过 Xcode 用户界面指定的代码(这是通过拖动到“退出”来连接到命名展开的 UI 过程)。
我在(错误的)假设下这是连接到我的展开方法(例如unwindFromHelp),就像在代码中将按钮连接到 IBAction 一样。相反,它动态连接到运行时层次结构中与该名称匹配的任何内容。
答案的关键见解来自Unwind segues 的用途以及您如何使用它们?@shawkinaw指出:
换句话说,将unwind动作视为描述segue 来自哪里,而不是它要去哪里。
这也意味着相同的展开方法名称可以有许多实现!在运行时,ViewController 层次结构会跟踪它在此过程中遇到的展开方法,调用 Segue Unwind 将展开到它找到的第一个方法。
基于这种新的理解,我可以通过创建一个通过 Xcode 退出方法手动添加的占位符展开来在未来的某个 ViewController 中调用展开方法。该操作显示了当时可用的所有展开方法。
因此解决方案涉及使用情节提要和(可能)未使用的 ViewController,其中定义了展开方法。然后所需 ViewController 的出口通过 Xcode 连接到该展开。
未来的用户还可以在新代码中定义相同的展开方法(例如unwindFromHelp),如果 ViewHierarchy 运行时堆栈没有匹配其他展开,则执行他们的代码。因此,这种委托方法解决了我最初的问题,未来的用户必须为委托提供一个实现(这里是一个展开方法名称,例如unwindFromHelp)。
我写了一个示例,展示了如何实现这一点,并且展开基于它如何到达那里返回到不同的 ViewController:github UnwindExample
示例流程图基于 A 或 B 调用帮助理念。
解决方案
推荐阅读
- c# - 用于生成图表的 EF 电动工具?
- python-2.7 - Jupyter 安装成功后没有名为 graphviz 的模块
- html - 简单的 5 星,但希望响应迅速
- java - 重新启动 appender 时,Chronicle Queue tailer 停止
- heroku - 在heroku上部署具有gdal依赖项的dash应用程序失败
- css - 第一个孩子的目标伪元素
- ruby-on-rails - `in_timezone` 接受哪些参数值?
- javascript - 从客户端向服务器端发送路由和数据时。我没有在服务器端接收数据
- macos - 在 Mac OSX 终端上合并 .csv 文件之间不使用新行
- android - 未找到支持 v7 的 SortedList