如何以编程方式展开到另一个故事板中的 ViewController?

gan*_*elo 3 uiviewcontroller ios uistoryboard swift3 xcode8

这已经让我发疯了近 2 天了。我已经尝试了几乎所有的方法,但无法获得任何结果。每个解决展开的帖子似乎都没有专门解决在不同故事板中展开回 ViewController 的问题,更不用说以编程方式进行了。我究竟做错了什么?????

我有两个 ViewControllers驻留在不同的故事板中......

我想从我的放松SignupViewController位于我注册情节串连图板,以我的LoginViewController位于我的登录故事板。我想在用户成功注册以编程方式执行展开,收到带有 OK 按钮的确认警报,然后单击 OK 按钮。

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

在此处输入图片说明

这就是我尝试这样做的方式

所以我在我的LoginViewController.swift文件中创建了一个unwindToLoginViewController操作方法,就像这样......

在此处输入图片说明

并在我的SignupViewController.swift文件中创建对它的引用,就像这样......

在此处输入图片说明

随后,我按预期获得了参考...

在此处输入图片说明

并将标识符设置为相同,以便我可以在我的代码中引用它...

在此处输入图片说明

当我运行我的应用程序并成功注册用户时,我会显示一个带有 OK 按钮的确认警报。当用户单击 OK 按钮时,我想放松到我的LoginViewController,但什么也没发生......

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

在此处输入图片说明

Rob*_*Rob 5

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

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

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
})
Run Code Online (Sandbox Code Playgroud)

但是让我们假设您确实想使用 unwind segue,因为您认为视图控制器位于视图层次结构中。(我知道这里不是这种情况,但为了将来的读者,我将探讨这种情况。)

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

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

(lldb) expr -l objc++ -O -- [UIViewController _printHierarchy] 
Run Code Online (Sandbox Code Playgroud)
<UINavigationController 0x7ff341047800>,状态:出现,视图:<UILayoutContainerView 0x7ff340f15610>
   | <MyApp.FirstViewController 0x7ff340c1d2f0>,状态:消失,视图:<UIView 0x7ff340c336a0>不在窗口中
   | <MyApp.SecondViewController 0x7ff340d08880>,状态:消失,视图:<UIView 0x7ff340d09620>不在窗口中
   | <MyApp.ThirdViewController 0x7ff3433089d0>,状态:消失,视图:<UIView 0x7ff343104b80>不在窗口中
   | <MyApp.FourthViewController 0x7ff343102810>,状态:消失,视图:<UIView 0x7ff340d0b150>不在窗口中
   | <MyApp.FifthViewController 0x7ff340f19c60>,状态:出现,视图:<UIView 0x7ff340d02010>

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

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