错误的“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上设置modalPresentationStyleUIModalPresentationCurrentContext

【讨论】:

谢谢,我认为第二种解决方案更好【参考方案3】:

如果您似乎需要在 iOS 11 中设置三件事。

controller.modalPresentationStyle = UIModalPresentationCurrentContext;
controller.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
self.definesPresentationContext = YES;
[self presentViewController:controller animated:YES completion:nil];

【讨论】:

以上是关于错误的“presentingViewController”的主要内容,如果未能解决你的问题,请参考以下文章

网页打开显示错误500是啥意思

Pig 安装错误:错误 pig.Main:错误 2998:未处理的内部错误

PHP错误处理

Java编程中常见的错误都有哪些

出错处理- 错误码-错误检查

错误精灵错误跟踪器错误