如何继续回到已经加载的UIViewController?
我有一个故事板的视图,有一个button来执行某个操作。 要执行此操作,用户必须已经login。button处理程序将testing用户是否已login,如果执行“是”则执行一个赛门铁克,如果执行“否”则执行另一个赛门铁克。 NO塞格推到一个login视图控制器。 还有另外一个连接回到第一个视图控制器,所以如果login成功,用户可以拿起他们离开的地方。 视图控制器embedded在导航控制器中。
问题是,'return'segue正在加载视图控制器的一个新的实例,而不是引用原始实例,所以我最终得到了空的界面元素和2个视图控制器在内存中的副本。
我怎样才能回到视图控制器的原始实例?
假设你使用“ push
”,你的意思是你正在使用一个UINavigationController
,那么你可以使用下面的代码返回到栈顶。
[self.navigationController popToRootViewControllerAnimated:YES];
要么
UIViewController *prevVC = [self.navigationController.viewControllers objectAtIndex:<n>]; [self.navigationController popToViewController:prevVC animated:YES];
popup到<n>
级别的特定级别。
要么
[self.navigationController popViewControllerAnimated:YES];
如果你只想popup一个级别备份导航堆栈。
而不是使用segue返回到前一个控制器,您应该使用与segue关联的事件,而不是使用当前视图控制器(如果segue是模式的),或者从导航控制器中popup(如果segue是推),前一个控制器将自动显示。
例如,如果您在login屏幕上按下button时正在执行回退的模式继续,则可以从故事板中删除继续,然后触摸与您的操作链接的button事件,即成功login后将会通知:
[self dismissViewControllerAnimated:YES completion:nil];
在故事板上,您将右键单击该button,并将发送事件内的触摸拖动到视图控制器场景的第一响应者。 这将执行在执行segue转换时执行的反向转换。 你可以使用模态的segue,不需要使用导航控制器。
如果将login视图推入导航控制器,则必须从堆栈popup(如果返回到上一个视图)。 使用其中之一:
[[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
animation过渡应该反转在渐变上使用的过渡types,所以当你消除视图时,卷曲将会被curl。
如果你正在使用继续前进,那么你应该使用放松继续返回。
https://developer.apple.com/library/ios/technotes/tn2298/_index.html
malhal是对的 – 值得点击他的链接。
代码似乎已经从苹果的例子稍微移动,并且更加灵活。 我有三个场景,但只有一个自定义ViewController .m文件。 我不想要一个导航堆栈。 访问后续的场景是从button继续。 我在基本视图控制器.m文件中添加了这一行:
- (IBAction)unwindForSegue:(UIStoryboardSegue *)unwindSegue towardsViewController:(UIViewController *)subsequentVC{}
然后在第三个场景中,我控制 – 从一个button拖动到退出图标,并select放松动作。 它现在从场景3退回到场景2,而不需要调用dismissViewController方法。