为啥我的 unwind segue 回退太远了?
Posted
技术标签:
【中文标题】为啥我的 unwind segue 回退太远了?【英文标题】:Why does my unwind segue go back too far?为什么我的 unwind segue 回退太远了? 【发布时间】:2015-10-17 00:56:46 【问题描述】:我正在尝试为我的应用的注册过程创建控制器架构。下面是当前状态的图片:
应用程序第一次在登录页面启动,如果用户点击“注册”,导航控制器将通过self.presentViewController
模态显示。导航控制器然后推送通过视图控制器,然后推送到第二个视图控制器。在第二个视图控制器上,用户必须先按“Go”以模态方式导航到请求附加信息的视图控制器,然后才能继续注册过程。一旦用户在这个模态呈现的控制器上输入了额外的信息,用户就会按下“Go Back”通过展开转场返回到第二个视图控制器。
但是,当按下它时,展开转场会返回到第二个视图控制器,但随后会立即返回到“登录”页面。即使 unwind 函数嵌套在第二个视图控制器中,似乎 unwind segue 会弹出所有模态呈现的视图。
发生了什么,展开到第二个注册页面的解决方案是什么?
【问题讨论】:
在我尝试重现之前检查一下:所以展开功能只出现在 SecondPage 视图控制器代码中? — 这是 ios 9 吗?在 iOS 9 中,展开转场的行为发生了很大变化,因此了解这一点很重要。 是的,它只出现在 SecondPage 视图中,这是 iOS 9。 【参考方案1】:我遇到了同样的问题,通常是由以下原因之一引起的:
-
使用已弃用的转场
在用于展开的@IBAction 方法中调用viewController.dismissViewControllerAnimated。
在错误的控制器中使用 @IBAction 展开。 @IBAction 应该在您想要放松的控制器中。
解开segue的步骤
在 SecondSignupController 中创建一个 @IBAction 方法,该方法将在展开时调用。此方法应以 UIStoryboardSegue 作为参数示例 -> @IBAction 函数 onUnwindFromModalPage(segue:UIStoryboardSegue)。此方法的主要目的是传回数据,否则您可以将其留空。
Control-Drag 从 Go-Back 按钮退出情节提要中模态呈现控制器中的符号。退出符号是选择控制器时控制器顶部的最后一个符号。这将显示您可以选择放松的@IBActions 列表。选择您在 SecondSignUpController 中创建的方法。
【讨论】:
是的,OP 分两个阶段看到这一点的事实让我想知道他是否还有其他导致额外展开的代码。 @wakeupsumo 不幸的是,我在创建 segue 时遵循了这些确切的步骤。而且我敢肯定,您提出的所有可能原因都不适用于我的情况。 当我在第二个视图控制器中删除用于展开的@IBAction 时,按下“返回”按钮不会执行任何操作。它只是停留在模态呈现的控制器上。 所以我在一个新的故事板中复制了完全相同的情况,它工作得很好。完全相同的代码和segues。不过需要注意的一点是,我第一次运行此程序时,我确实在 @IBAction 中有self.dismissViewControllerAnimated(true, completion: nil)
用于放松转场。我删除了这个,但不知何故,即使在清理和重建之后行为仍然存在?
如果您从第二个控制器中删除了 IBAction,并且之前的控制器没有您的展开 IBAction,则不会发生任何事情。 Unwind segue 查找实现该方法的第一个前一个控制器。我认为您的问题是dismissViewControllerAnimated 它首先解除了模态呈现的控制器,然后整个导航控制器将您带回登录控制器。奇怪的是它第一次使用它。以上是关于为啥我的 unwind segue 回退太远了?的主要内容,如果未能解决你的问题,请参考以下文章
从 Unwind segue 触发时,Push segue 不起作用
使用 unwind segues 通过 UITableViewcell 推送数据