(UINavigationController&UIViewController)执行dismissViewControllerAnimated的区别

Difference of (UINavigationController&UIViewController) perform dismissViewControllerAnimated

我想知道UINavigationControllerUIViewController的区别,它们都执行选择器dismissViewControllerAnimated。 事实是它们都有效。我是这样做的:

代码:

UIViewController *vc = [UIViewController alloc] init];
UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:vc];
[self presentViewController:nav animated:YES completion:nil];

在新控制器中,我这样做了:

// self.navigationController to dismiss
[self.navigationController dismissViewControllerAnimated:YES completion:nil];
// self to dismiss
[self dismissViewControllerAnimated:YES completion:nil];

两者都很好,但我不知道有什么区别?

首先,UINavigationControllerUIViewController 的子类,并且 UIViewController 具有模态呈现视图的能力。所以你可以从 类.

当嵌入 UINavigationControllerUIViewController 可见时,基本上 UIViewControllerUINavigationController 同时可见,技术上都可以模态地呈现另一个视图。

以模态方式呈现视图通常意味着停止您之前正在做的任何事情以做其他事情,然后返回到您离开的地方 - 例如,更改设置。

由于您要让两个视图控制器去做其他事情,所以从哪个视图控制器显示并不重要。但是,presentingViewController 会有所不同,具体取决于您展示的是哪一个,所以如果您完全需要 属性,那很重要。

如果模态视图控制器以某种方式与 UIViewController 而不是 UINavigationController 相关,那么也许最好,但这实际上只是一种风格。

让我们考虑第一种情况

[self.navigationController dismissViewControllerAnimated:YES completion:nil];

导航控制器是根视图控制器,您可以使用根视图显式调用关闭 controller.which您可以说容器视图控制器

考虑第二种情况

[self dismissViewControllerAnimated:YES completion:nil];

在这种情况下,您将关闭嵌入在容器视图控制器中的子 viewcontroller。 假设现在在呈现之后你推送一个视图控制器,现在当你调用 dismissViewControllerAnimated 时它会关闭呈现的和推送的视图控制器。