当您使用 segues 时,流程会前后移动。当用户向后移动(即按下“返回”)时,它不会推送到新的 VC,但会弹出到已经存在的 VC。当你弹出时,当前的 VC 会从堆栈和内存中移除。
如果您在流程中需要向后移动,那么这是错误的。你只需要继续前进。
为 SEGUE 做好充分准备
在为 segue 做准备时,您永远不应该创建自己的视图控制器并推送给它们。故事板可以为您完成所有这些工作。
正确的 prepareForSegue 方法应该如下所示...
- (void)prepareForSegue:(UIStoryBoardSegue*)segue
{
if([segue.identifier isEqualToString:"SomeSegue"])
{
MyNewViewController *controller = segue.destinationViewController;
controller.someProperty = "some value to pass in";
}
}
这就是你所需要的。请注意,仅当您打算将一些信息传递给新的视图控制器时才需要它。如果你没有向前传递任何东西,那么你根本不需要这个方法。
当方法结束时,新的 VC 将被故事板文件推送到屏幕上。
解开游戏
如果您有一个随机流程(如您的评论中所示),那么您可以使用 unwind segues 来实现这一点。
在你的“A”视图控制器中,有一个类似...的功能
- (IBAction)someUnwindAction:(UIStoryboardSegue*)sender
{
//some action to run when unwinding.
}
它需要接收一个 UIStoryboardSegue 对象。如果设置为 IBAction,您还可以从 Interface Builder 访问它。
现在当你想去 A > B > C > B > A 时,只需使用标准的推送和弹出(从 segue 和后退按钮)。
当你想去 A > B > C > A 时,你可以使用控制器 C 的 unwind segue。
如果你在控制器 C 中有一个取消按钮或其他东西,它在 Interface Builder 中,这应该带你回到控制器 A。然后在控制器 C 下方的 Interface Builder 中,你将有一个带门的绿色小方块和一个指向它的箭头。只需将取消按钮的动作指向该符号并选择“someUnwindAction”。 (注意,unwindAction 在 A 中,按钮在 C 中。)然后 XCode 使用它把你一直弹出到 A 并处理删除任何内存和东西。如果您愿意,您也可以将其他信息发送回 A。
如果您想以编程方式从 C 中访问此展开转场,那么您可以运行...
[self performSegueWithIdentifier:"someUnwindAction" sender:nil];
这也会弹回 A。