首页 > 解决方案 > 将 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 调用帮助理念

标签: iosobjective-cswiftuistoryboardsegueprogrammatically-created

解决方案


推荐阅读