如何以编程方式在另一个情节提要中放松到 ViewController?

How to unwind to a ViewController in another storyboard programmatically?

这让我抓狂了将近 2 天。我已经尝试了几乎所有的方法,但无法得到任何结果。每个解决展开的 post 似乎都没有专门解决展开回到 ViewController 在不同的情节提要 中,更不用说以编程方式进行了。我做错了什么?????

我有两个 ViewController 位于不同的故事板中...

我想从位于注册故事板中的注册ViewController到我的登录ViewController 位于我的 登录故事板 中。我想在 用户成功注册后 以编程方式执行展开,收到带有“确定”按钮的确认警报,然后单击“确定”按钮。

这是我想放松的地方 => 到

这就是我尝试做的方式

所以我在 LoginViewController.swift 文件中创建了一个 unwindToLoginViewController 操作方法...

并在我的 SignupViewController.swift 文件中创建对它的引用...

随后,我得到了预期的参考...

并设置相同的 Identifier,这样我就可以在我的代码中引用它...

当我 运行 我的应用程序成功注册用户时,我会显示带有“确定”按钮的确认提示。当用户单击 OK 按钮时,我想放松到我的 LoginViewController,但是什么都没有发生...

有什么线索吗???????

Unwind segues 应该只用于回退到已经呈现并且仍在视图控制器层次结构中的视图控制器。

在上面的评论中,很明显情况并非如此。看起来您的意图是关闭视图层次结构中当前的所有内容,并将其替换为完全不同的场景(示例中的登录场景)。在这种情况下,您应该只用类似的东西替换根视图控制器(如 所示):

let window = UIApplication.shared.keyWindow!
let frame = window.rootViewController!.view.frame

let controller = UIStoryboard(name: "Login", bundle: nil)
    .instantiateViewController(withIdentifier: "...")!

controller.view.frame = frame

UIView.transition(with: window, duration: 0.3, options: .transitionCrossDissolve, animations: {
    window.rootViewController = controller
}, completion: { completed in
    // maybe do something here
})

但是让我们暂时假设您确实想要使用展开转场,因为您认为视图控制器 在视图层次结构中。 (我知道这里不是这种情况,但为了未来的读者,我将探讨这种情况。)

最重要的是,如果 unwind segue 失败,您应该首先确认具有 unwind IBAction 的视图控制器确实在视图控制器层次结构中。

如果您不确定视图控制器层次结构,请暂停应用程序的执行并打印层次结构:

(lldb) expr -l objc++ -O -- [UIViewController _printHierarchy] 
<UINavigationController 0x7ff341047800>, state: appeared, view: <UILayoutContainerView 0x7ff340f15610>
   | <MyApp.FirstViewController 0x7ff340c1d2f0>, state: disappeared, view: <UIView 0x7ff340c336a0> not in the window
   | <MyApp.SecondViewController 0x7ff340d08880>, state: disappeared, view: <UIView 0x7ff340d09620> not in the window
   | <MyApp.ThirdViewController 0x7ff3433089d0>, state: disappeared, view: <UIView 0x7ff343104b80> not in the window
   | <MyApp.FourthViewController 0x7ff343102810>, state: disappeared, view: <UIView 0x7ff340d0b150> not in the window
   | <MyApp.FifthViewController 0x7ff340f19c60>, state: appeared, view: <UIView 0x7ff340d02010>

只需确保具有展开操作的视图控制器显示在层次结构中。

最重要的是,您只能展开到视图控制器层次结构中的当前内容,因此请确保它在那里。