我在 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:
的调用,您可以通过查找堆栈来做到这一点。这是解决此问题的实现。
上面提到的解决方案不起作用,因为它依赖于查看特定类的调用堆栈符号,而该类在真实设备上运行时会被混淆。这是我解决此问题所采取的另一种方法:
- 向您的模态视图 Controller 类添加一个
weak
UIDocumentMenuViewController
属性。 - 在模态类中重写
-presentViewController:animated:completion:
来检查所呈现的 View Controller 是否为UIDocumentMenuViewController
,如果是,则将其设置为值针对第 1 步中您的薄弱属性。 - 重写
-dismissViewControllerAnimated:completion:
以检查您的弱属性是否为nil
,如果它不是nil
以及您模态的>presentedViewController
是nil
那么这意味着 WebKit 试图在不应该的情况下关闭你的模式。在这种情况下,您可以避免调用super
,否则继续调用它。
您还可以调整 WKFileUploadPanel
的 _dismissDisplayAnimated:
method对您自己的 View Controller 更加小心,但这会带来很大的风险。
关于xcode - UIDocumentPickerViewController 取消父 View Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41085881/