iOS:解除并呈现ModalViewController而无需访问其Parent ViewController

Byt*_*yte 6 iphone ipad modalviewcontroller presentmodalviewcontroller ios

背景:我想解雇一个我之前提出过的模态视图,然后立即呈现viewController我刚刚用新信息解雇的视频.

问题:如果没有显示指向ViewController第一个ViewController模态的父级的显式指针,我就不会非常成功.我正在尝试编写这个有用viewController的代码,而不会弄乱前面的代码.

可能的领先优势:我一直在尝试一些事情:

1.)试图访问父母ViewController,这时我不知道如何.

2.)一旦获得父母的访问权限,我可以简单地应用以下代码:

UIViewController* toPresentViewController = [[UIViewController alloc] init];
    [self dismissViewControllerAnimated:YES completion:^{
        [parentViewControllerAccessor presentModalViewController:toPresentViewController animated:YES];
}];
Run Code Online (Sandbox Code Playgroud)

理论上,这应该适用于父母的访问权限viewController.我对其他方式持开放态度.

假设:您无权更改父级中的任何代码ViewController.

jha*_*ott 11

您的代码看起来应该有效.如果您使用的是iOS 5,则会有一个UIViewController名为的属性presentingViewController.

@property(nonatomic, readonly) UIViewController *presentingViewController;
Run Code Online (Sandbox Code Playgroud)

因此,您可以使用此属性来获取呈现模态控制器的视图控制器.

注意:在iOS 4 parentViewController中将设置为呈现控制器,因此如果您同时支持iOS 4和5,则必须首先检查操作系统版本以确定要访问的属性.在iOS 5中,Apple已修复此问题,因此parentViewController现在专门用于包含视图控制器的父级(请参阅文档中的实现容器视图控制器一UIViewController).

编辑:关于self.presentingViewController从块内访问:到调用块时(在模态视图控制器被解除之后),presentingViewController属性可能设置为nil.请记住,self.presentingViewController块内部会在执行块时提供属性的值,而不是在创建块时.为防止这种情况,请执行以下操作:

UIViewController* toPresentViewController = [[UIViewController alloc] init];
UIViewController* presentingViewController = self.presentingViewController;
[self dismissViewControllerAnimated:YES completion:^
{
    [presentingViewController presentModalViewController:toPresentViewController animated:YES];
}];
Run Code Online (Sandbox Code Playgroud)

这是必要的,不是因为self已经/被解散(它被块安全地保留),而是因为它不再被呈现,因此它presentingViewController现在是零.没有必要存储presentingViewController其他地方,局部变量很好,因为它将被块保留.