使用 presentingViewController 关闭 viewController

Posted

技术标签:

【中文标题】使用 presentingViewController 关闭 viewController【英文标题】:dismiss viewController by using presentingViewController 【发布时间】:2013-10-31 02:02:31 【问题描述】:

我有三个 ViewController,它的顺序是(A 呈现 B,呈现 C), 当我留在 C viewController 时,我必须将 ViewController 解散到 B viewController。

对于C viewController,它的presentingViewCONtroller是B viewController

当然,我可以使用

[self dismissViewControllerAnimated:YES completion:NULL];//self means C ViewController

但我想知道我也可以使用以下方法:

[self.presentingViewController dismissViewControllerAnimated:YES completion:NULL];

因为C的presentingViewController是B ViewController,但是效果是一样的。 self 表示 C ViewController 而 self.presentingViewController 表示 B ViewController,但他们也做了同样的工作

第二个问题是我不能使用以下方法连续关闭两个viewController:

  [self dismissViewControllerAnimated:YES completion:^
    [self.presentingViewController.presentingViewController dismissViewControllerAnimated:YES completion:NULL];
]; //self means C viewController

感谢您的帮助!

【问题讨论】:

【参考方案1】:

当然,我可以使用

[self dismissViewControllerAnimated:YES completion:NULL];//self means C ViewController

这只会解散C,而不是您似乎想要的B

但我想知道我也可以使用以下方法:

[self.presentingViewController.presentingViewController dismissViewControllerAnimated:YES completion:NULL];

是的,这行得通。如有疑问,请尝试一下。

第二个问题是我不能使用以下方法来连续关闭两个viewController:

[self dismissViewControllerAnimated:YES completion:^
    [self.presentingViewController.presentingViewController dismissViewControllerAnimated:YES completion:NULL];
]; //self means C viewController

这不是问题。无论如何,它不起作用的原因是在您解雇自己之后,您的presentingViewControllernil。您需要将其存储在一个临时变量中。

UIViewController *gp = self.presentingViewController.presentingViewController;
[self dismissViewControllerAnimated:YES completion:^
    [gp dismissViewControllerAnimated:YES completion:nil];
    [self.presentingViewController.presentingViewController dismissViewControllerAnimated:YES completion:nil];
];

当然,两者会有不同的动画,你需要决定你喜欢哪一个。

【讨论】:

谢谢你的第二个回答,很抱歉我没有对第一个问题进行区分。我只是想知道 self 和 self.presenting 代表不同的对象,但它们可以做同样的工作【参考方案2】:

查看文档:

呈现视图控制器负责关闭视图 它呈现的控制器。 如果您在呈现的视图上调用此方法 控制器本身,它会自动将消息转发到 呈现视图控制器。

【讨论】:

【参考方案3】:

请检查:self.presentingViewController.presentingViewController 是不是 A viewController。

如果没有,我认为您需要使用委托或处理程序。

在我的例子中,我使用了一个 tabbarcontroller 作为 rootViewController。当我使用 self.presentingViewController.presentingViewController 时,我得到了 rootViewController (tabbarcontroller),它对 presentingViewControler 方法没有响应。

【讨论】:

以上是关于使用 presentingViewController 关闭 viewController的主要内容,如果未能解决你的问题,请参考以下文章

presentingViewController 是不是与presentingViewController 一起旋转

presentedViewController 和 presentingViewController 以及 dismissViewControllerAnimated 的使用

“GIDSignIn”类型的值没有成员“presentingViewController”

如何在 iOS 7+ 中使用当前 ViewController 设置 PresentingViewController

错误的“presentingViewController”

presentingViewController 总是得到 UITabBarController