47

我在情节提要上有一个视图,它有一个按钮来执行某个操作。但是,要执行此操作,用户必须登录。按钮处理程序测试用户是否已登录,如果是,则执行一个 segue,如果不是,则执行另一个 segue。NO segues 推送到登录视图控制器。还有另一个 segue 连接回第一个视图控制器,所以如果登录成功,用户可以从他们离开的地方继续。视图控制器嵌入在导航控制器中。

问题是,'return' segue 正在加载视图控制器的全新实例,而不是引用原始实例,所以我最终在内存中得到了空的界面元素和该视图控制器的 2 个副本。

我怎样才能回到视图控制器的原始实例?

4

4 回答 4

137

假设您使用 " push" 意味着您正在使用 a UINavigationController,那么您可以使用以下内容返回堆栈顶部。

[self.navigationController popToRootViewControllerAnimated:YES];

或者

UIViewController *prevVC = [self.navigationController.viewControllers objectAtIndex:<n>];
[self.navigationController popToViewController:prevVC animated:YES];

弹出到特定级别<n>的级别。

或者

[self.navigationController popViewControllerAnimated:YES];

如果您只想弹出一层备份导航堆栈。

于 2012-04-04T01:57:19.160 回答
33

与其使用 segue 返回上一个控制器,不如使用与 segue 关联的事件,而不是关闭当前视图控制器(如果 segue 是模态的)或从导航控制器中弹出它(如果 segue 是push),之前的控制器会自动显示。

例如,如果在您按下登录屏幕上的按钮时正在执行返回的模态转场,则您从情节提要中删除转场,并在与您的操作链接的按钮的触摸内部事件中删除该转场,成功登录后将会通知:

 [self dismissViewControllerAnimated:YES completion:nil];

在情节提要上,您将右键单击按钮并将发送事件中的触摸向上拖动到视图控制器场景的第一响应者。这将执行执行 segue 转换时执行的反向转换。您可以为此使用模态转场,无需使用导航控制器。

如果您将登录视图推送到导航控制器上,那么您必须将其从堆栈中弹出(如果返回到前一个视图)。使用其中之一:

    [[self navigationController] popViewControllerAnimated:YES];  // goes back to previous view
[[self navigationController] popToViewController: myViewControllerAfterLogin animated:YES]; // goes back to specific view on stack. 
[[self navigationController] popToRootViewControllerAnimated:YES]; // goes back to first view on the stack

动画过渡应该与 segue 上使用的过渡类型相反,因此当您关闭视图时 curl up 会向下卷曲。

于 2013-05-20T21:07:20.780 回答
5

如果您使用 segue 前进,那么您应该使用 unwind segue 来返回。有关如何使用展开转场的详细信息,请参阅此技术说明 TN2298 使用展开转场

于 2015-04-19T16:11:55.857 回答
2

malhal 是对的 - 值得点击他的链接。

代码似乎与 Apple 的示例有所不同,而且更加灵活。我有三个场景,但只有一个自定义 ViewController .m 文件。我不想要导航堆栈。对后续场景的访问是通过按钮进行的​​。我在基本视图控制器 .m 文件中添加了这一行:

- (IBAction)unwindForSegue:(UIStoryboardSegue *)unwindSegue towardsViewController:(UIViewController *)subsequentVC{}

然后在第三个场景中,我从一个按钮控制拖动到退出图标并选择了展开动作。它现在从场景 3 退回到场景 2,而无需调用 dismissViewController 方法。

于 2016-06-01T12:24:12.697 回答