【问题标题】:Long press leads to an error/warning when WKWebView tries to present a WKActionSheet当 WKWebView 尝试呈现 WKActionSheet 时,长按会导致错误/警告
【发布时间】:2015-01-04 16:38:43
【问题描述】:

我的视图层次结构如下所示:

  • (root) PRSBaseViewController - UIViewController 子类 - 有子 viewControllers
    • (已提交)PRSModalWebViewController - UINavigationController 子类
      • (推送,动画:否)PRSWebViewController - UIViewController 子类 - WKWebView 是子视图。

当我尝试长按 WebView 中的链接时,出现错误:

Warning: Attempt to present <WKActionSheet: 0x127520d10> on <PRSBaseViewController: 0x1275117f0> whose view is not in the window hierarchy!

不是使用presentViewController:animated:completion 呈现导航,而是使用addChildViewController: 舞蹈将视图控制器添加到层次结构中。我没有收到任何错误,这很奇怪。

有谁知道导致视图层次结构问题的原因是什么?

更新:我做了一个Gist of all my classes

【问题讨论】:

  • @matt 我不是要压制共享表,而是违背我的意愿压制它们。我不想要并且正在得到的行为是他问题的答案。
  • 就是这样,这是苹果的私人课程。我在开发者论坛上发布了我的问题以获得良好的衡量标准。感谢您对它的破解。
  • 哦,我明白了!对于那个很抱歉。所以这是苹果公司为了回应长按而提出的。我很抱歉让你教育我,但我很高兴你这样做了!
  • 出现此错误是因为 WebKit 错误地尝试在 [view.window rootViewController] (source) 上呈现 WKActionSheet。但是如果根视图控制器已经在呈现某些东西,那么这是错误的。

标签: ios objective-c presentviewcontroller wkwebview


【解决方案1】:

我也遇到过类似的行为 - 也没有弄清楚这是如何发生的或为什么会发生。

这是我的解决方法。由于 WKWebView 正在调用我的 RootViewController,我通过覆盖 RootViewController 的 presentViewController:animated:completion: 来处理这个问题: - 如果 RootViewController 已经有一个 presentViewController,那么它将消息转发到该控制器。它似乎解决了警告消息,并在模式视图中使用 WKWebView 时为我提供了长按菜单。

- (void)presentViewController:(UIViewController *)viewControllerToPresent animated:(BOOL)flag completion:(void (^)(void))completion {

    // Unsure why WKWebView calls this controller - instead of it's own parent controller
    if (self.presentedViewController) {
        [self.presentedViewController presentViewController:viewControllerToPresent animated:flag completion:completion];
    } else {
        [super presentViewController:viewControllerToPresent animated:flag completion:completion];
    }
}

或者快速:

override func presentViewController(viewControllerToPresent: UIViewController, animated flag: Bool, completion: (() -> Void)?) {
    if presentedViewController != nil {
        // Unsure why WKWebView calls this controller - instead of it's own parent controller
        presentedViewController?.presentViewController(viewControllerToPresent, animated: flag, completion: completion)
    } else {
        super.presentViewController(viewControllerToPresent, animated: flag, completion: completion)
    }
}

【讨论】:

  • 这正是我所做的,我只是忘了回答我自己的问题。
  • 所以这个修复是显示操作表还是显示它?我想在我的应用中查看操作表,以便我可以执行一些操作
  • 成功了!伟大的!将 Todd 的代码添加到您的控制器中,例如警告详细信息中的“”
  • 这也是我实施的解决方法。当我开始看到崩溃报告时,这个问题在我的应用程序中变得很明显。如果 WKWebView 被关闭并且设备随后被旋转,则该问题将显示为异常并且应用程序崩溃。
【解决方案2】:

我们在 PSPDFKit 中也看到了这个问题,在调查了 UIKit 程序集和 WKWebView 源之后,我们发现了一个仍然很糟糕但没有侵入性的解决方法。

主要策略是有选择性并及时应用解决方法 - 然后再次清理。你可以在这里阅读源代码:

https://gist.github.com/steipete/b00fc02aa9f1c66c11d0f996b1ba1265

请欺骗rdar://26295020,希望能在 iOS 10 中及时修复。(该错误自 iOS 8 以来就存在,并且首次在 iOS 8b5 上报告。)

【讨论】:

  • 这也适用于任意长的未知视图控制器链,我们需要它,因为我们在一个框架上工作,所以不要控制应用程序中的所有视图控制器。
猜你喜欢
  • 1970-01-01
  • 2016-06-21
  • 2016-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-07
相关资源
最近更新 更多