'presentViewController'错了

时间:2012-10-29 09:02:18

标签: objective-c ios uiviewcontroller

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

3 个答案:

答案 0 :(得分:14)

调用[self presentViewController:messageController animated:YES completion:nil];并不一定使用您调用它的vc来呈现其他vc。默认情况下,它沿vc层次结构向上移动,并在根视图控制器上显示另一个vc。这就是为什么在你的情况下,呈现视图控制器是一个UINavigationController。

如果你想强制你的MainViewController成为呈现vc,你可以打电话:

[self setDefinesPresentationContext:YES];
在呈现MessageViewController之前,在MainViewController上

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

答案 1 :(得分:4)

来自this question

的答案副本

来自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

答案 2 :(得分:1)

如果你需要在iOS 11中设置三件事。

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