我只是添加了TabBarController + NavigationController。在此之前一切都还可以,但是现在当我从一个模态调用presentViewController时,我收到了这个错误:
由于未捕获的异常而终止应用 'NSInvalidArgumentException',原因:' - [UITabBarController tableViewListado]:无法识别的选择器发送到实例
当我使用TabBar和Nav控制器时,我是否应该以不同的方式获取呈现控制器,而不是接收预期的对象(ViewController)我得到“UITabBarController”?
没有TabBar / Nav我正在使用它:
ViewController *parentView = (ViewController *)[self presentingViewController];
[parentView something];
修改
请注意,如果我这样做有效,但不要认为这实际上是最好的方法:
ViewController *parentView = (ViewController *)[(UINavigationController *)[((UITabBarController *)[self presentingViewController] ) selectedViewController] topViewController] ;
[parentView something];
答案 0 :(得分:4)
来自Programming iOS 6, by Matt Neuburg:
在iPad上,当呈现的视图控制器的modalPresentationStyle是UIModalPresentationCurrentContext时,必须决定哪个视图控制器应该是呈现的视图控制器的presentViewController。这将确定将由所呈现的视图控制器视图替换的视图。此决定涉及另一个UIViewController属性,definePresentationContext(BOOL)。从发送了presentViewController:animated:completion:的视图控制器开始,我们走向父视图控制器链,寻找其definePresentationContext属性为YES的控制器。如果我们找到一个,就是那个;它将是presentsViewController,它的视图将被呈现的视图控制器视图所取代。如果我们找不到,那么就像所呈现的视图控制器的modalPresentationStyle是UIModalPresentationFullScreen一样。
TL; DR
1.在期望的definesPresentationContext
上将presentingViewController
设置为true
2.在期望的modalPresentationStyle
UIModalPresentationCurrentContext
设置为presentedViewController