6

在我的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];
4

3 回答 3

14

调用[self presentViewController:messageController animated:YES completion:nil];不一定使用您调用它的 vc 来呈现另一个 vc。默认情况下,它沿着 vc-hierarchy 向上传播,并在根视图控制器上呈现另一个 vc。这就是为什么在您的情况下,呈现视图控制器是UINavigationController.

如果你想强制你的 MainViewController 是呈现的 vc,你可以调用:

[self setDefinesPresentationContext:YES];

在显示 MessageViewController 之前,在 MainViewController 上。

编辑:如果其他人读到这个:definesPresentationContext似乎被窃听或文档错误。请参阅下面的评论和Cocoa Builder

于 2012-10-29T09:25:11.290 回答
6

我对这个问题的回答的副本

Programming iOS 6, by Matt Neuburg

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

TL;DR
1. 将所需设置definesPresentationContext为真presentingViewController
2. 设置modalPresentationStyleUIModalPresentationCurrentContext所需presentedViewController

于 2014-10-03T19:42:03.287 回答
1

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

controller.modalPresentationStyle = UIModalPresentationCurrentContext;
controller.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
self.definesPresentationContext = YES;
[self presentViewController:controller animated:YES completion:nil];
于 2017-11-30T08:30:37.823 回答