我在故事板上有一个视图,它有一个按钮来执行某个动作。但是,要执行此操作,用户必须登录。按钮处理程序将测试用户是否已登录并在是(YES)时执行一个segue,如果为NO则执行另一个segue。 NO segues推送到登录视图控制器。还有另一个segue连接回第一个视图控制器,因此如果登录成功,用户可以从中断的地方继续。视图控制器嵌入在导航控制器中。
问题是,'return'segue正在加载视图控制器的一个全新实例,而不是引用原始实例,因此我最终得到了空接口元素和内存中该视图控制器的2个副本。
如何返回视图控制器的原始实例?
答案 0 :(得分:137)
假设您使用“push
”表示您使用的是UINavigationController
,那么您可以使用以下内容返回到堆栈顶部。
[self.navigationController popToRootViewControllerAnimated:YES];
或
UIViewController *prevVC = [self.navigationController.viewControllers objectAtIndex:<n>];
[self.navigationController popToViewController:prevVC animated:YES];
弹出到<n>
为级别的特定级别。
或
[self.navigationController popViewControllerAnimated:YES];
如果您只想弹出一个级别备份导航堆栈。
答案 1 :(得分:33)
您应该使用与segue相关联的事件而不是使用segue返回到前一个控制器,而是使用与当前视图控制器相关的事件(如果segue是模态的)或从导航控制器中弹出(如果segue是推的),前一个控制器将自动显示。
例如,如果按下登录屏幕上的按钮时正在执行的模式segue,则从故事板中删除segue,并在按钮的内部触摸事件中删除与您的操作相关联的按钮,成功登录后会致电:
[self dismissViewControllerAnimated:YES completion:nil];
在故事板上,您将右键单击该按钮并将内部发送事件中的触摸拖动到视图控制器场景的第一个响应者。这将执行执行segue转换时执行的反向转换。您可以使用模态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上使用的过渡类型,因此当您关闭视图时,卷曲将会缩小。
答案 2 :(得分:5)
如果您使用segue前进,那么您应该使用展开segue返回。有关如何使用展开segue的详细信息,请参阅此Technical Note TN2298 Using Unwind Segues。
答案 3 :(得分:2)
malhal是对的 - 值得点击他的链接。
代码似乎已经从Apple的例子中略微转移,并且更加灵活。我有三个场景,但只有一个自定义ViewController .m文件。我不想要导航堆栈。通过按钮的segue访问后续场景。我在基本视图控制器.m文件中添加了这一行:
- (IBAction)unwindForSegue:(UIStoryboardSegue *)unwindSegue towardsViewController:(UIViewController *)subsequentVC{}
然后在第三个场景中,我控制 - 从按钮拖动到退出图标并选择展开动作。它现在从场景3回退到场景2,而不需要调用dismissViewController方法。