从第二个 ViewController 回到第一个 ViewController
Posted
技术标签:
【中文标题】从第二个 ViewController 回到第一个 ViewController【英文标题】:Going back to first ViewController from second ViewController 【发布时间】:2012-03-15 14:26:27 【问题描述】:我正在构建一个当前有 3 个 ViewControllers 的应用程序。其中一个在成功登录后使用,因此与此问题无关。
当我发现 Storyboard 无法为我提供所需的精细控制时,我正在混合使用 Storyboard 和以编程方式构建事物。
第一个 ViewController 内置在我的“MainStoryboard”中。它在底部有一个登录表单和一个信息按钮。我通过在 didFinishLaunchingWithOptions 中执行以下操作将其链接到我的 AppDelegate:
ViewController *viewController = (ViewController *)self.window.rootViewController;
因为我想强制渲染 UIWebView(另一个故事),所以我以编程方式创建了第二个视图。我在 didFinishLaunchingWithOptions 中执行以下操作:
infoViewController = [[InfoViewController alloc] init];
[infoViewController view];
在我的两个 ViewController 中,我设置了一个指向 appDelegate 的链接,如下所示:
appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
我的第一个 ViewController 中有一个信息按钮,可将您带到 infoViewController。点击时会调用以下代码:
appDelegate.infoViewController.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
[self presentModalViewController:appDelegate.infoViewController animated:YES];
以上对我来说很好用,翻转屏幕并显示 InfoViewController。
在我的 InfoViewController 上,我有一个按钮可以让您返回登录页面,我已经尝试了各种方法来让它工作,但它只会让我的应用程序崩溃。似乎没有任何效果。我尝试了以下方法:
appDelegate.viewController.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
[self presentModalViewController:appDelegate.viewController animated:YES];
和
[self.navigationController popToRootViewControllerAnimated:YES];
和
[self.navigationController popViewControllerAnimated:YES];
和
[self.navigationController popToViewController:appDelegate.viewController animated:YES];
我怀疑最后 3 个可能与您拥有导航视图控制器并且想要返回根目录时有关?我不确定,但无论哪种方式都行不通。我以前使用故事板进行过这项工作,所以我相信它应该很容易!如前所述,我切换到以编程方式制作 infoViewController,以便我可以强制 UIWebView 在视图出现之前呈现。
非常感谢任何帮助。
【问题讨论】:
我认为下面的dismissModalViewController 答案是正确的。附带说明一下,您使用 [infoViewController 视图] 完成了什么; ??此外,您可以在创建控制器时设置该控制器的过渡样式。 嗨,我稍后会尝试以下建议(午休结束,回到我的 php/JS 日常工作)。 [infoViewController 视图] 从字面上看,它只是显示一个 UIWebView,其中包含有关应用程序的一些信息。我怀疑也许你会认为我应该在第一个 ViewController 的另一个视图中显示这些信息?我真正使用 ObjC/ios 才 3-4 周,所以我可能没有完全遵循最佳实践。 知道了,但是 view 只是 ViewController 的一个属性。它是由视图控制器管理的视图……不是动词,而是名词。我认为在你要求的时候它是零。 (它可能会在第一次从 nib 加载视图控制器时导致状态更改,这是对视图进行第一次延迟加载,但您通常无需担心。演示文稿正常工作) .尝试评论该行,看看它的行为是否不同。 【参考方案1】:你可以这样做:
[self dismissModalViewControllerAnimated:YES];
【讨论】:
【参考方案2】:你应该使用这个。
[self dismissModalViewControllerAnimated:YES];
【讨论】:
【参考方案3】:您应该使用主控制器在其他视图控制器之间切换。将根控制器的视图更改为其他视图控制器之一(如果需要,照常应用动画)。在其他视图控制器中持有指向根控制器的指针并调用self.rootController.view = <desired_controller_instance>.view
【讨论】:
【参考方案4】:我认为您展示 InfoViewController 的方式是错误的。请按照以下方式进行:
在您的 ViewController 中,为信息按钮创建一个操作。:
- (IBAction)infoButtonTapped:(id)sender
InfoViewController *infoViewController = [[InfoViewController alloc] init];
infoViewController.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
[self presentModalViewController:infoViewController animated:YES];
在你的 InfoViewController 中,在你应该带你回来的按钮的动作中写下这个:
- (void)takeBackToViewController
[self dismissModalViewControllerAnimated:YES];
希望它有效。
【讨论】:
【参考方案5】:您也可以在提供的控制器中使用它
if(self.parentViewController)
[self.parentViewController dismissModalViewControllerAnimated:YES];
else
[self.presentingViewController dismissModalViewControllerAnimated:YES];
解除当前控制器。
【讨论】:
以上是关于从第二个 ViewController 回到第一个 ViewController的主要内容,如果未能解决你的问题,请参考以下文章
从第一个 UIAlertController 打开第二个 UIAlertController
如何实例化第二个 ViewController 并停止第一个 ViewController 的方法