在没有故事板的情况下放松

Unwind without Storyboard

我正在用 xib 文件替换情节提要中的当前视图。但是我遇到了一个关于 unwind.

的问题

在 Xib 文件中,我无法创建展开转场。并且找不到常规方法。当我在网上搜索这个问题时,我发现大约 "How to perform unwind segue programmatically." 这不是我想要的。我需要一种以编程方式执行展开操作的方法。

我在 Apple 文档中找到了 How an Unwind Segue Determines its Destination View Controller,我认为我可以通过编程方式完成此操作。但是,viewControllerForUnwindSegueAction:fromViewController:withSender: 方法(现在是 forUnwindSegueAction(_:from:withSender:))已被弃用,此操作的新方法 (childContaining(_:)) 使用无法以编程方式初始化的 UIStoryboardUnwindSegueSource 实例。

所以,我可以看到两个选项。

  1. 确定应用程序中的展开点并创建操作以手动为每个展开点执行此操作
  2. 创建一个 unwind 执行器对象的工作方式类似于 Apple 的 unwind 执行器,但使用它自己的方法。

据我所知,第二种选择更好。但是,正如我在问题开头所说的那样。我在网上找不到任何东西,就像我遇到过这种情况一样,我确定这不是真的。我想我用错误的关键字搜索了这个,我需要一些帮助来解决这个问题。我想在 select 以下选项之一之前学习一些东西:

这是我的一些 Google 搜索

Unwind without storyboard

Unwind without interface builder

How to create unwind segue without storyboard

您并不孤单,也不是第一个遇到此问题的人。我称之为反向路由问题

为了说明问题,我将展示一个相对复杂的展开情况的故事板版本:

我们有一个带有两个 children 的标签栏控制器。第一个 child 是一个导航控制器,它已将一个视图控制器(第一行末尾的绿色 v.c。)推到其根视图控制器(黄色 v.c 的顶部)。 ).第二个child是一个普通的view controller,呈现了一个view controller(第二行末尾的白色v.c)。

我们的目标是摆脱白色 v.c。到 黄色 v.c。在顶行。

如果您使用故事板,这很简单。黄色v.c。包含一个 unwind 方法(名称实际上并不重要),并且您 "hook" 从白色 v.c 中的按钮退出 segue。那个方法。在运行时,用户点击按钮,运行时 "magically" 消除白色 v.c,将标签栏控制器切换到第一个 child,弹出绿色 v.c ., 把我们留在黄色 v.c。随心所欲。

现在用代码来做!嗯,是的,当然。如何?就是这个问题。

具有讽刺意味的是。显然,运行时 知道 如何解决这个问题,因为它 确实 解决了在情节提要中使用展开转场时的问题。但是当您 使用情节提要时,就没有 built-in 程序化模拟。没有 unwind 命令会导致复杂的展开机制被激活并执行与 storyboard-based 应用程序相同的操作。

这是 UIKit 中的一个巨大缺陷。苹果基本上要求我们使用故事板。但每个人都知道,团队开发的任何应用程序都可能避免使用故事板,因为通过 git 协调故事板的版本几乎是不可能的。所以苹果似乎并不存在于现实世界中;他们没有提供实际开发应用程序所需的运行时支持。

一个简单的解决方案——简单到粗暴的地步——就是放松一下"by hand"。该应用程序有一个 "coordinator" object ,其工作是处理这种向后路由。如果你是小白v.c。并且您想 "unwind" 到黄色 v.c。,您的协调员只需要 知道 这是我们可能想要做的事情,它 知道 到达那里需要哪些必要步骤。

基本上,我的意思是必须向协调器提供应用程序需要执行的所有后向路由的固定列表,以及如何执行它们的说明。给定我们所在的位置和我们想要返回的位置,协调器只执行相应的步骤。

(你,OP,会注意到我没有告诉你任何你不知道的事情。我所概述的显然是你的选项 1。这是正确的。我在说什么你是:选项 2 会很好,但它不存在并且不值得尝试写,所以只能回到选项 1。)