从第二个 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 的方法

如何在第二个 ViewController 表格视图中使用模型快速显示第一个 ViewController 值

如何从viewcontroller转换到其他?

axios 调用从第一个 api 获取响应并传递到第二个 api