在我的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];
答案 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)
来自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];