2011-12-08 40 views
12

我有一个基于tab的应用程序。其中的views之一是推送modal view controller。如果我在modal view controller内拨打self.presentingViewController,它将返回tab bar controller,而不是view controller推送它。self.presentingViewController返回UITabBarController而不是视图控制器用presentModalViewController推动它

我在这里错过了什么?有没有可靠的方法来返回view controller提升模式?

谢谢。

+0

您是否找到答案? – dimirc

+0

我认为答案可能是parentViewController,我发现它适用于iOS 8,但不是7,至少在我的用例中。 –

回答

3

从苹果公司的文档:

此属性的默认实现走到认为 层次,从这个视图控制器开始。第一个视图 控制器发现已收到 presentViewController:animated:completion:方法,或者其 definedPresentationContext属性设置为YES作为该属性的 值返回。它继续向上走直到 找到要返回的值或它到达根视图控制器。

所以,即使其他视图控制器推动它,该视图控制器的视图被模态视图覆盖。他们沿着层次结构走,直到找到没有遮挡视图的视图控制器,或者将其设置为YES,或者直到它到达根视图控制器(在您的情况下是Tab Bar Controller)。

我想说,呈现视图控制器需要设置definesPresentationContext为YES来回答你的问题,如何返回呈现模态的视图控制器。

+1

非常感谢您在正确的方向。但是'definePresentationContext'没有任何区别。 UITabBar仍然是响应,我假设,因为它接收'presentViewController:animated:completion:'。我不得不诉诸注册视图控制器与应用程序委托,并引用它的方式。 – nekiTamoTip

12

这是一个iPhone应用程序吗?如果是这样,那就解释了混乱。在iPhone上,唯一的演示风格是UIModalPresentationFullScreen - 这相当于在iPhone上说,根视图控制器始终是呈现视图控制器。那么,在标签栏界面中,UITabBarController的视图就是根视图控制器。

你会注意到,在iPhone上,模态视图不会取代你的视图控制器的视图;它取代了整个界面,这意味着它取代了标签栏控制器的视图。这是因为标签栏控制器真的呈现视图控制器。

我猜iPhone上你真的不应该发送presentViewController:presentModalViewController:到一个标签栏控制器包含的视图控制器。您应该将其发送到标签栏控制器。因此该消息将被路由到标签栏控制器。

所以,除非你在iPad上,否则presentingViewController的值将不会发生任何有趣的变化。在iPad上,可以使模态视图替换视图控制器的视图。为此,模态视图的modalPresentationStyle必须是UIModalPresentationCurrentContext。在这种情况下,其实际上可以是“推模态视图控制器”的视图。

相关问题