如何切换回已经加载的UIViewController?

Tij*_*Kez 47 objective-c storyboard ios segue

我在故事板上有一个视图,它有一个按钮来执行某个动作.但是,要执行此操作,用户必须登录.按钮处理程序将测试用户是否已登录并在是(YES)时执行一个segue,如果为NO则执行另一个segue.NO segues推送到登录视图控制器.还有另一个segue连接回第一个视图控制器,因此如果登录成功,用户可以从中断的地方继续.视图控制器嵌入在导航控制器中.

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

如何返回视图控制器的原始实例?

Mic*_*lum 137

假设您使用" push"表示您正在使用a UINavigationController,那么您可以使用以下命令返回到堆栈顶部.

[self.navigationController popToRootViewControllerAnimated:YES];
Run Code Online (Sandbox Code Playgroud)

要么

UIViewController *prevVC = [self.navigationController.viewControllers objectAtIndex:<n>];
[self.navigationController popToViewController:prevVC animated:YES];
Run Code Online (Sandbox Code Playgroud)

弹出到特定级别,其中<n>是级别.

要么

[self.navigationController popViewControllerAnimated:YES];
Run Code Online (Sandbox Code Playgroud)

如果你只想弹出一个级别备份导航堆栈.


TRV*_*707 33

你应该使用与segue相关联的事件代替当前视图控制器(如果segue是模态的)或者从导航控制器中弹出这个(如果segue是push)和前一个控制器将自动显示.

例如,如果在按下登录屏幕上的按钮时正在执行返回的模态segue,则会从故事板中删除segue,并在成功登录时与您的操作链接的按钮内部事件中删除将会通知:

 [self dismissViewControllerAnimated:YES completion:nil];
Run Code Online (Sandbox Code Playgroud)

在故事板上,您将右键单击该按钮并将内部发送事件中的触摸拖动到视图控制器场景的第一个响应者.这将执行执行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
Run Code Online (Sandbox Code Playgroud)

动画过渡应该反转segue上使用的过渡类型,因此当您关闭视图时,卷​​曲将会向下移动.


mal*_*hal 5

如果你使用segue前进那么你应该使用展开segue返回.有关如何使用展开segue的详细信息,请参阅技术说明TN2298使用展开锯齿.