定义演示上下文/UIModalPresentation当前上下文的问题 - 当前上下文视图控制器丢失



当您在由导航控制器管理的视图控制器中演示时,这才适用。

复制步骤如下:

1 - 使用 UIModalPresentationCurrentContext 呈现视图控制器

self.definesPresentationContext = YES;
ViewController* viewController = [[ViewController alloc] init];
viewController.modalPresentationStyle = UIModalPresentationCurrentContext;
[presentOnViewController presentViewController:viewController animated:YES completion:nil];

2 - 使用默认的全屏演示样式在顶部显示视图控制器

ViewController* viewController = [[ViewController alloc] init];
[self presentViewController:viewController animated:YES completion:nil];

3 - 关闭顶部显示的视图控制器(全屏视图控制器)

[self dismissViewControllerAnimated:YES completion:nil];

现在的问题是第二个视图控制器(使用UIModalPresentationCurrentContext呈现)消失了。 此外,使用UIModalPresentationCurrentContext呈现另一个视图控制器是不可能的,因为系统认为它仍然存在。

我相信

这个问题是框架中的一个错误。 如前所述,它仅在由导航控制器管理的视图控制器中呈现时才发生。 有一个令人讨厌的工作,它使用包含 API。 它创建一个虚拟视图控制器,从中呈现视图。 步骤如下:

1 - 在上下文中呈现父级是导航控制器的视图时,请使用虚拟视图控制器:

- (void)presentInContext
{
    UIViewController* presentOnViewController = self;
    if ([self.parentViewController isKindOfClass:[UINavigationController class]])
    {
        // Work around - Create an invisible view controller
        presentOnViewController = [[DummyViewController alloc] init];
        presentOnViewController.view.frame = self.view.frame;
        // Containment API
        [self addChildViewController:presentOnViewController];
        [self.view addSubview:presentOnViewController.view];
        [presentOnViewController didMoveToParentViewController:self];
        presentOnViewController.definesPresentationContext = YES;
    }
    ViewController* viewController = [[ViewController alloc] init];
    viewController.modalPresentationStyle = UIModalPresentationCurrentContext;
    [presentOnViewController presentViewController:viewController animated:YES completion:nil];
}

2 - 关闭视图控制器时整理

- (void)dismissSelf
{
    __weak UIViewController* presentingViewController = self.presentingViewController;
    [self dismissViewControllerAnimated:YES completion:^{
        // Remove the dummy view controller
        if ([presentingViewController isKindOfClass:[DummyViewController class]])
        {
            [presentingViewController willMoveToParentViewController:nil];
            [presentingViewController.view removeFromSuperview];
            [presentingViewController removeFromParentViewController];
        }
    }];
}

就是这样...修复很脏,但没有视觉闪烁。

最新更新