如何在程序中以编程方式将视图控制器解开到另一个故事板中的视图控制器?

3
这让我苦恼了将近两天。我尝试了所有方法,却没有任何结果。每篇涉及解开的帖子似乎都没有具体涉及编程方式下在不同故事板中返回到ViewController,更不用说以编程方式完成了。我做错了什么????
我有两个ViewControllers,分别位于不同的storyboard中......
我想从我的“注册视图控制器”(位于我的“注册故事板”中)解开到我的“登录视图控制器”(位于我的“登录故事板”中)。我想在用户成功注册后,在收到确认警报并单击确认按钮后以编程方式解开。
这就是我想要解开的地方=>到

enter image description here

这是我的尝试方式:
因此,我在我的LoginViewController.swift文件中创建了一个unwindToLoginViewController操作方法,如下所示...

enter image description here

并在我的SignupViewController.swift文件中创建一个对它的引用,如下所示...

enter image description here

随后,我如预期地获得了参考资料...

enter image description here

并将标识符设置在同一位置,这样我就可以在我的代码中引用它...

enter image description here

当我运行我的应用程序,成功地注册了一个用户,我会显示一个带有OK按钮的确认提示框。当用户点击OK按钮时,我想要返回到我的LoginViewController>,但是什么都没有发生......

有什么线索吗?????

enter image description here


@Morits - 谁在“喊叫”?我只是强调一下,但还是谢谢你加的额外标签 :) - gangelo
1
快速测试的结果:在不同的Storyboard中解开到视图控制器没有问题...所以你的代码中一定还有其他问题。你确定那行代码被执行了吗?如果是,你确定此时的self引用的是正确的上下文吗? - DonMag
@DonMag 我确定代码被执行了,因为我触发了我设置的断点。self引用正确的SignupViewController VC :S - gangelo
@gangelo Unwind Segue 用于弹出到上一个视图控制器,如果它之前没有被实例化,你可能需要使用 Push Segue。 - chengsam
2
@gangelo - 好的 - 那么,有几个可能适合您的选项... 1)使用Rob提到的“交换根视图控制器”方法,或者2)从LoginViewController开始并立即“自动显示”注册流程中的第一个VC。然后您可以“回退”到登录并“忘记”所有其他内容。 - DonMag
显示剩余5条评论
1个回答

5

仅在需要返回到已经被呈现且仍在视图控制器层次结构中的视图控制器时才应使用反向segue。

从上面的评论中可以清楚地看出这并不是情况。您似乎想关闭当前在视图层次结构中的所有内容并用完全不同的场景(例如登录场景)替换它。在这种情况下,您应该将根视图控制器替换为类似以下内容的东西(如https://dev59.com/y1gR5IYBdhLWcg3wlOEr#41144822所示):

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
})

假设您确实想使用撤销分流,因为您认为视图控制器将在视图层次结构中。 (我知道这里不是这种情况,但为了未来的读者,请允许我探讨这种情况。)

总之,如果撤销分流失败了,您应首先确认带有 IBAction 撤销的视图控制器实际上处于视图控制器层次结构中。

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

(lldb) expr -l objc++ -O -- [UIViewController _printHierarchy] 
<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>

确保带有解开操作的视图控制器在层级结构中显示。

总之,您只能解开当前在视图控制器层次结构中的内容,因此请确保它在那里。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接