presentingViewController 总是得到 UITabBarController

Posted

技术标签:

【中文标题】presentingViewController 总是得到 UITabBarController【英文标题】:presentingViewController getting always UITabBarController 【发布时间】:2012-06-06 03:17:53 【问题描述】:

我只是添加了 TabBarController + NavigationController。在此之前一切正常,但现在当我从模态调用presentingViewController 时,出现此错误:

由于未捕获的异常而终止应用程序 'NSInvalidArgumentException',原因:'-[UITabBarController tableViewListado]: 无法识别的选择器发送到实例

我得到的是“UITabBarController”,而不是接收预期的对象 (ViewController),在使用 TabBar 和 Nav 控制器时,我是否应该以某种不同的方式获取呈现控制器?

没有 TabBar/Nav 我使用的是这个:

ViewController *parentView = (ViewController *)[self presentingViewController]; 

[parentView something];

编辑:

只是发现如果我这样做它会起作用,但不要认为这实际上是最好的方法:

ViewController *parentView = (ViewController *)[(UINavigationController *)[((UITabBarController *)[self presentingViewController] ) selectedViewController] topViewController]  ;

[parentView something];

【问题讨论】:

你需要在调用presentingViewController的地方添加一些代码。 看看这个 - ***.com/questions/8437908/… 是的,这是我同样的问题,但我之前读过,但不知道如何解决问题 似乎你有一个丑陋的解决方案,但我建议你检查你的导航堆栈层次结构,然后它会让你清楚地知道你需要获取什么。 您得到的解决方案没有错,考虑到您在视图控制器上的设计,它适用于您的情况。 【参考方案1】:

我来自this question的回答的副本

来自Programming ios 6, by Matt Neuburg:

在 iPad 上,当呈现视图控制器的 modalPresentationStyle 是 UIModalPresentationCurrentContext 时,必须决定哪个视图控制器应该是呈现视图控制器的presentingViewController。这将确定哪个视图将被呈现的视图控制器的视图替换。这个决定涉及另一个 UIViewController 属性,definePresentationContext (a BOOL)。从 presentViewController:animated:completion: 被发送到的视图控制器开始,我们沿着父视图控制器链遍历,寻找其定义PresentationContext 属性为 YES 的视图控制器。如果我们找到一个,那就是那个;它将是presentingViewController,并且它的视图将被呈现的视图控制器的视图替换。如果我们没有找到,事情就像呈现的视图控制器的 modalPresentationStyle 是 UIModalPresentationFullScreen。

TL;DR 1.在所需的presentingViewController上将definesPresentationContext设置为true 2.在想要的presentedViewController上设置modalPresentationStyleUIModalPresentationCurrentContext

【讨论】:

以上是关于presentingViewController 总是得到 UITabBarController的主要内容,如果未能解决你的问题,请参考以下文章

错误的“presentingViewController”

presentingViewController 总是得到 UITabBarController

presentingViewController 显示为 null

为啥解散presentingViewController,只解散子控制器?

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

使用 presentingViewController 关闭 viewController