xcode - UIDocumentPickerViewController 取消父 View Controller

标签 xcode wkwebview uidocumentpickervc

我在 View Controller 中有一个 WKWebView 。当用户单击“上传文件”按钮(位于所示网页上)时,会弹出 UIDocumentPickerViewController。这是预期的并且完全必要的,但是:

每当用户单击任何按钮(“上传照片或视频”、“取消”)时,UIDocumentPickerViewController 都会关闭其自身及其所在的父 View Controller 。

我为 [UIViewController DismissViewControllerAnimated:completion:] 添加了一个符号断点,并且确实看到 -dismissViewController... 被调用了两次。第一次之后,它会关闭 UIDocumentPickerViewController,第二次之后,它会关闭我的父 View Controller 。

顺便说一句,在 iPad 上没有问题,可能是因为 UIDocumentPickerViewController 以弹出框的形式呈现。

为什么会发生这种情况,我应该做什么?

谢谢!

最佳答案

好吧,我想我已经找到了解决这个问题的方法。 WebKit 是开源的,您可以看到有问题的类是 WKFileUploadPanel,特别是 _dismissDisplayAnimated: method被调用得太激进,无意中触发 View Controller 的解雇。为了避免这种情况,您需要阻止对来自 WKFileUploadPanel-dismissViewControllerAnimated:completion: 的调用,您可以通过查找堆栈来做到这一点。这是解决此问题的实现。

上面提到的解决方案不起作用,因为它依赖于查看特定类的调用堆栈符号,而该类在真实设备上运行时会被混淆。这是我解决此问题所采取的另一种方法:

  1. 向您的模态视图 Controller 类添加一个 weak UIDocumentMenuViewController 属性。
  2. 在模态类中重写 -presentViewController:animated:completion: 来检查所呈现的 View Controller 是否为 UIDocumentMenuViewController,如果是,则将其设置为值针对第 1 步中您的薄弱属性。
  3. 重写 -dismissViewControllerAnimated:completion: 以检查您的弱属性是否为 nil,如果它不是 nil 以及您模态的 >presentedViewControllernil 那么这意味着 WebKit 试图在不应该的情况下关闭你的模式。在这种情况下,您可以避免调用 super,否则继续调用它。

您还可以调整 WKFileUploadPanel_dismissDisplayAnimated: method对您自己的 View Controller 更加小心,但这会带来很大的风险。

关于xcode - UIDocumentPickerViewController 取消父 View Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41085881/

相关文章:

swift - Couchbase 接收 channel 空

ios - 如何使用所有类型的 UTI 初始化 UIDocumentPickerViewController

ios - UIDocumentPickerViewController - 隐藏位置按钮

ios - ios swift 无法从 UIDocumentPickerViewController 获取 .doc 文件

swift - 无法访问公共(public)枚举 Swift 4.2

iphone - 令人沮丧的 UIWebView 委托(delegate)崩溃问题

ios - 在 WKWebView 中禁用 JavaScript - 偏好设置不保存在 WKWebView 中

ios - 如何从 WKWebView 获取 cookie

ios - 长按识别器结束后调用 wkwebview decidePolicyForNavigationAction

ios - Vapor 3.1.10 Xcode-11.3.1 编译问题