如何继续回到已经加载的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方法。