2

仅当您在由导航控制器管理的视图控制器中呈现时,才会出现这种情况。

复制步骤如下:

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 呈现另一个视图控制器,因为系统认为它仍然存在。

4

1 回答 1

3

我相信这个问题是框架中的一个错误。如前所述,它仅在由导航控制器管理的视图控制器中呈现时发生。有一个使用包含 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];
        }
    }];
}

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

于 2012-12-05T14:07:13.797 回答