错误的“presentingViewController”
Posted
技术标签:
【中文标题】错误的“presentingViewController”【英文标题】:Wrong 'presentingViewController' 【发布时间】:2012-10-29 09:02:17 【问题描述】:在我的MainViewController
中,我通过这个展示了另一个视图控制器:
MessageViewController *messageController = [[MessageViewController alloc]initWithNibName:nil bundle:nil];
[messageController setModalPresentationStyle:UIModalPresentationFullScreen];
[messageController setModalTransitionStyle:UIModalTransitionStyleFlipHorizontal];
[self presentViewController:messageController animated:YES completion:nil];
[messageController release];
这将正确显示视图控制器。但是,当我尝试返回呈现视图控制器(在本例中应该是 MainViewController
)时,此代码不起作用:
if ([self.presentingViewController isKindOfClass:[MainViewController class]])
[(MainViewController *)self.presentingViewController setCurrentViewTag:2];
[self dismissModalViewControllerAnimated:YES];
我删除了“if..”条件以强制它设置当前视图标签。发生错误,告诉我呈现的视图控制器似乎是 UINavigationController
:
[UINavigationController setCurrentViewTag:]: unrecognized selector sent to instance 0x8352a50
谁能告诉我为什么会这样?这段代码以前可以工作,我不确定是什么改变使它停止正常工作。
编辑
这是更新后的代码:
ReaderController *readerController = [[ReaderController alloc]initWithNibName:nil bundle:nil];
[readerController loadWhichViewToShow:2];
[self setDefinesPresentationContext:YES];
[readerController setModalPresentationStyle:UIModalPresentationFullScreen];
[readerController setModalTransitionStyle:UIModalTransitionStyleFlipHorizontal];
[self presentViewController:readerController animated:YES completion:nil];
[readerController release];
【问题讨论】:
【参考方案1】:调用[self presentViewController:messageController animated:YES completion:nil];
不一定使用你调用它的vc 来呈现另一个vc。默认情况下,它沿着 vc-hierarchy 向上传播,并在根视图控制器上呈现另一个 vc。这就是为什么在您的情况下呈现视图控制器是UINavigationController
。
如果你想强制你的 MainViewController 成为展示的 vc,你可以调用:
[self setDefinesPresentationContext:YES];
在显示 MessageViewController 之前在 MainViewController 上。
编辑:如果其他人读到此:definesPresentationContext
似乎被窃听或文档错误。请参阅下面的 cmets 和 Cocoa Builder
【讨论】:
您的代码发出警告。Instance method -definesPresentationContext: not found
感谢您的回答。我认为这是正确的,但它并没有解决真正的问题。我这样做的原因:[(MainViewController *)self.presentingViewController setCurrentViewTag:2];
是因为当前视图标签负责显示视图。所以如果我将它设置为 1,它应该显示登录视图。如果我将它设置为 2,它应该显示主视图。但是,遵循您的代码仍然会产生相同的错误。
呈现的vc还是UINavigationController?
是的。我应该将 MainViewController 设置为 App Delegate 中的 rootViewController 吗?
另一方面,如果你使用 UINavigationController,你的 MainViewController 必须是它的 topViewController。所以另一种方法是代替调用if ([self.presentingViewController isKindOfClass:[MainViewController class]]) [(MainViewController *)self.presentingViewController setCurrentViewTag:2];
,您可以将其修改为if ([self.presentingViewController.topViewController isKindOfClass:[MainViewController class]]) [(MainViewController *)self.presentingViewController.topViewController setCurrentViewTag:2];
【参考方案2】:
我来自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
上设置modalPresentationStyle
为UIModalPresentationCurrentContext
【讨论】:
谢谢,我认为第二种解决方案更好【参考方案3】:如果您似乎需要在 iOS 11 中设置三件事。
controller.modalPresentationStyle = UIModalPresentationCurrentContext;
controller.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
self.definesPresentationContext = YES;
[self presentViewController:controller animated:YES completion:nil];
【讨论】:
以上是关于错误的“presentingViewController”的主要内容,如果未能解决你的问题,请参考以下文章