【问题标题】:Issue with definesPresentationContext / UIModalPresentationCurrentContext - Current context view controller gets lostdefinePresentationContext / UIModalPresentationCurrentContext 的问题 - 当前上下文视图控制器丢失
【发布时间】:2012-12-05 14:07:13
【问题描述】:

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

复制步骤是:

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

【问题讨论】:

    标签: ios ipad cocoa-touch


    【解决方案1】:

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

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

    【讨论】:

    • 对不起我的错误答案,我已经删除了。我在一个非常简单的项目中测试了这种情况并轻松确认了问题。我希望你已经向 Apple 提交了错误报告;我一定会的。
    • 是的...已提交错误报告。
    • 谢谢,真是个奇怪的问题。非常感谢。
    猜你喜欢
    • 2012-05-19
    • 1970-01-01
    • 1970-01-01
    • 2015-11-13
    • 1970-01-01
    • 1970-01-01
    • 2021-11-12
    • 1970-01-01
    • 2012-02-19
    相关资源
    最近更新 更多