【问题标题】:Warning when Attempting to Dismiss View Controller (Modal within a Modal)尝试关闭视图控制器时发出警告(模态中的模态)
【发布时间】:2014-02-20 05:26:12
【问题描述】:

当我的 iOS 应用第一次启动时,我会自动打开一个“欢迎”模式,如下所示:

UIViewController *intro = [self.storyboard instantiateViewControllerWithIdentifier:@"intro"];

intro.modalPresentationStyle = UIModalPresentationFullScreen;

//Show the modal
[self presentViewController:intro animated:NO completion:nil];

在该模式中,指示用户将应用链接到 Dropbox。他们点击一个触发此按钮的按钮:

[[DBSession sharedSession] linkFromController:self];

这是一个 Dropbox SDK 方法,它在 另一个模式 中打开 Dropbox 身份验证 UIWebView,如下所示:http://d.pr/i/6ZnC

一旦他们登录,模式就会自动关闭。

然后我尝试用这个关闭原始的介绍模式:

[self dismissViewControllerAnimated:YES completion:nil];

但是我收到了这个警告并且模式没有关闭

警告:在演示或关闭过程中尝试从视图控制器 关闭!

这是我尝试过的:

  1. 我在dismissViewControllerAnimated 之前设置了一个人为的延迟来让 Dropbox 模式关闭,但这并没有帮助:[NSThread sleepForTimeInterval:2.0];
  2. 我试过关闭动画:[self dismissViewControllerAnimated:NO completion:nil];,但也没有用。
  3. 我已尝试检查模式解雇是否已在进行中:if(![self isBeingDismissed]){ ... },但没有运气。

有什么想法吗?如何确定究竟是什么呈现/关闭并阻止模态关闭?

iOS 7 + Xcode 5

【问题讨论】:

    标签: ios objective-c presentviewcontroller


    【解决方案1】:

    我发现了这个问题。你可以在DBSession+ios.m看到这条线

    [rootController presentModalViewController:navController 动画:是];

    因此,他们将在内部展示来自self 的身份验证视图控制器。您已经从self 展示了您的视图控制器。因此,当他们或您尝试从自己关闭视图控制器时,请给出此警告,因为它已呈现视图控制器。所以不要将 self 传递给 dropBox,而是传递 intro 视图控制器。

    [[DBSession sharedSession] linkFromController:intro];
    

    【讨论】:

    • 嗯...我正在从 inside intro 打开 Dropbox 模式,所以要引用它需要我指向 self,不是吗? intro 在父控制器中。
    • 换一种方式试试吧.. [[DBSession sharedSession] linkFromController:self.presentingViewController];不知何故,模态控制器堆栈被破坏了,它们没有干净地堆积起来..
    • 确切点,您在哪里尝试在身份验证后关闭?那是如何获得经过身份验证和解除的委托方法?
    • 我尝试了 self.presentingViewController,但这不起作用,因为我当前的模式 (introViewController) 正在覆盖它。
    • 是的,有问题。因为委托总是在解雇之前被调用。
    【解决方案2】:

    尝试调用

    [self dismissViewControllerAnimated:YES completion:nil];
    

    从 introViewController 内部而不是从根目录。如果没有其他模式,这应该调用 self.presentingViewController。所以我会在第一个的完成句柄块中嵌套一个

    【讨论】:

    • 我可能不太清楚,但我从introViewController 内部调用dismissViewControllerAnimated 并没有运气。 :(
    【解决方案3】:

    我发现如果您在上一个事务(动画)正在进行时尝试推送/关闭视图控制器,则会出现此问题。

    0.50 到 1 秒之间获取NSTimer 和dismissViewController。这是一个有用的技巧,因此您当前的 viewController 已经完成了动画。

    否则不确定,但请尝试将 NO 设置为 dismissViewControllerAnimated

    [self dismissViewControllerAnimated:NO completion:nil];
    

    【讨论】:

    • 我尝试了定时器延迟并关闭动画,但仍然出现错误。
    猜你喜欢
    • 1970-01-01
    • 2013-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-11
    相关资源
    最近更新 更多