不需要故事板就能解压

问题描述 投票:0回答:1

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

在Xib文件中,我不能创建unwind segues。而且也找不到常规的方法来解决这个问题。当我在网上搜索这个问题时,我只找到了 "如何以编程方式执行unwind segue"。这不是我想要的。我需要一种以程序化的方式来执行unwind操作。

我发现 放风段如何确定其目的地视图控制器? 在苹果文档中,我想我可以通过编程来实现。但是,这个 viewControllerForUnwindSegueAction:fromViewController:withSender: 方法(现在是 forUnwindSegueAction(_:from:withSender:))已被弃用,新的操作方法(childContaining(_:))使用的是 UIStoryboardUnwindSegueSource 实例,不能通过编程初始化。

所以,我可以看到两个方案。

  1. 在app中确定解卷点,并为每个解卷点手动创建操作来完成这个操作
  2. 创建一个unwind执行器对象,工作原理和苹果的unwind执行器一样,但使用自己的方法。

在我看来,第二个选项更好。但是,正如我在问题的开头所说,我在网上找不到任何东西。我在网上找不到任何资料,好像只有我遇到了这种情况,而且我确信这不是真的。我想我用错误的关键字搜索这个,我需要一些帮助来解决这个问题。在选择这个选项之前,我想了解一些事情。

  • 有没有第三种方法来解决这个问题
  • 您(不使用storyboard或xib的程序员)如何解决这个问题?

以下是我在谷歌搜索的一些内容

不需要故事板就能解压

不需要界面生成器就能解锁

如何在没有故事板的情况下创建收放自如的转折点

ios swift unwind-segue
1个回答
0
投票

你不是一个人,你也不是第一个遇到这个问题的人。我把这个问题称为 反向选择.

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

enter image description here

我们有一个有两个子节点的标签栏控制器。第一个子代是一个导航控制器,它已经将一个视图控制器(第一行末尾的绿色v.c.)推到了它的根视图控制器(黄色v.c.)之上。第二个子代是一个普通的视图控制器,它已经呈现了一个视图控制器(第二行末尾的白色v.c.)。

我们的目标是将白色的v.c.解开到 v.c.在顶行。

如果你使用的是故事板,这只是一个小问题。黄色的v.c.包含一个 unwind 方法(名字其实并不重要),然后你把白色v.c.中的按钮的退出转接 "钩 "到该方法上。在运行时,用户点击按钮,运行时就会 "神奇地 "解除白色v.c.,将tab栏控制器切换到第一个子代,并弹出绿色v.c.,让我们如愿以偿地进入黄色v.c.。

现在用代码来做吧!嗯,是的,当然。怎么做? 这就是问题所在

讽刺是显而易见的。显然,运行时 知道 如何解决这个问题,因为它 是否 当你在故事板中使用unwind segue时,就可以解决这个问题。但是,当你在故事板中使用解卷转场时,没有内置的程序模拟。 使用故事板。没有 unwind 命令,使复杂的解卷机制被激活,并做同样的事情,如果这是一个基于故事板的应用程序。

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

一个简单的解决方案--简单到粗暴的地步--就是 "手工 "解压。应用程序有一个 "协调器 "对象,它的工作就是处理这种后向路由。如果你在白色的v.c.中,而你想 "解除 "到黄色的v.c.,你的协调器只需做到 知道 这是我们可能想要做的事情,而且它 知道 为了达到这个目的,需要哪些必要的步骤。

基本上,我想说的是,必须为协调器提供一份固定的清单,列出应用程序需要执行的所有后退路线,以及如何执行这些路线的说明。给定我们现在的位置和想回到的地方,协调器只需执行相应的步骤。

(你,上位者,会观察到我没有告诉你任何你不知道的事情。显然,我所概述的正是你的选择1。这是对的。我想告诉你的是:方案2会很好,但它不存在,也不值得去写,所以还是回到方案1吧)。)

© www.soinside.com 2019 - 2024. All rights reserved.