我有一个基于tab
的应用程序。其中一个views
正在推动modal view controller
。如果我在self.presentingViewController
内拨打modal view controller
,则会返回tab bar controller
,而不是推送它的view controller
。
我在这里缺少什么?是否有可靠的方法来返回view controller
提升模式?
感谢。
答案 0 :(得分:12)
这是一款iPhone应用吗?如果是这样,那就解释了混乱。在iPhone上,唯一的演示风格是UIModalPresentationFullScreen
- 相当于在iPhone上说,根视图控制器始终是呈现视图控制器。好吧,在标签栏界面中,UITabBarController的视图是根视图控制器。
你会注意到在iPhone上,模态视图不会取代视图控制器的视图;它取代了整个界面,这意味着它取代了标签栏控制器的视图。这是因为标签栏控制器确实 呈现视图控制器。
我猜你在iPhone上确实不应该将presentViewController:
或presentModalViewController:
发送到标签栏控制器所包含的视图控制器。您应该将其发送到标签栏控制器。因此,消息将被路由到标签栏控制器。
所以,除非你在iPad上,否则presentingViewController
的价值不会发生任何有趣的事情。在iPad上,可以使模态视图替换视图控制器的视图。为此,模态视图的modalPresentationStyle
必须为UIModalPresentationCurrentContext
。在这种情况下,它的presentingViewController
可以实际上是“推动模态视图控制器”的视图。
答案 1 :(得分:3)
来自Apple的文档:
此属性的默认实现向上查看 层次结构,从此视图控制器开始。第一个观点 控制器发现收到了 presentViewController:animated:completion:方法,或者有它的 设置为YES的definesPresentationContext属性作为返回 财产的价值。它一直向上走,直到它 找到要返回的值或者它到达根视图控制器。
因此,即使其他视图控制器推动它,该视图控制器的视图也会被模态视图覆盖。它们沿层次结构向上走,直到找到一个视图控制器没有遮挡其视图,或者definesPresentationContext
设置为YES,或者直到它到达根视图控制器(在您的情况下是Tab Bar Controller)。
我想说,呈现视图控制器需要将definesPresentationContext
设置为YES以回答关于如何返回呈现模式的视图控制器的问题。