如何确定当前视图控制器呈现的是哪个视图控制器? (苹果手机)

Posted

技术标签:

【中文标题】如何确定当前视图控制器呈现的是哪个视图控制器? (苹果手机)【英文标题】:How to determine what view controller presented the current view controller? (iphone) 【发布时间】:2014-01-30 20:02:27 【问题描述】:

根据呈现当前视图控制器的视图控制器,我需要当前视图控制器被两个呈现视图控制器中的任何一个解除。

这是当前视图控制器中的方法:

-(void)goBack:(id)sender 
if ([self.presentingViewController.presentingViewController isKindOfClass:[InitialViewController class]])
    [self.presentingViewController dismissViewControllerAnimated:YES completion:nil];

else 
    [self.presentingViewController.presentingViewController dismissViewControllerAnimated:YES completion:nil];


但它不起作用。我究竟做错了什么?非常感谢您!

【问题讨论】:

也许你应该多描述一下架构。您确定这是呈现的视图控制器情况而不是推送/弹出情况吗?如果是,您想区分什么?您真正想实现什么? 另外,请注意您所说的presentViewController 的视图控制器实际上可能不是presentingViewController。很容易对此感到困惑。 是的,对不起,我应该更准确。在某些情况下,我当前的视图控制器由 SecondViewController 呈现,以防万一由 FirstViewController 呈现。在其他情况下,我当前的视图由 FirstViewController 直接呈现。我的目标是,当当前视图控制器被关闭时,FirstViewController 会出现。 在这种情况下self.presentingViewController.presentingViewController 应该可以工作。它适用于我的机器。 可能问题是你在if/else 测试中写错了条件。使用日志记录来确保所做的选择是您所期望的。 【参考方案1】:

您解雇的方法没有任何问题(尽管我之前的回答错误!)。有什么问题是你的逻辑。问题是这一行:

if ([self.presentingViewController.presentingViewController isKindOfClass:[InitialViewController class]])

改成:

if ([self.presentingViewController isKindOfClass:[SecondViewController class])

这应该完全符合您的要求。

【讨论】:

【参考方案2】:

如果您想获取呈现特定视图控制器的视图控制器,只需执行viewController.presentingViewController。这应该始终设置为呈现当前视图控制器的任何视图控制器,这就是重点。因此,如果您想关闭当前视图控制器,请执行以下操作:

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

【讨论】:

以上是关于如何确定当前视图控制器呈现的是哪个视图控制器? (苹果手机)的主要内容,如果未能解决你的问题,请参考以下文章

在当前显示的视图控制器上呈现 UIWebview

如何在 Swift 中识别我们来自哪个视图控制器

如何当前呈现视图控制器的实例?

如果当前视图控制器被呈现并推送,如何展开到正确的视图控制器?

如何以编程方式快速使用情节提要 ID 获取当前视图控制器(当前正在呈现)?

呈现的视图控制器如何从当前方向(尤其是横向)初始化?