UIDocumentPickerViewController

UIDocumentPickerViewController

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

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

我为[UIViewController dismissViewControllerAnimated:completion:]添加了一个符号断点,并且确实看到-dismissViewController...被调用了两次。第一次后,它关闭UIDocumentPickerViewController,第二次后-我的父视图控制器。

顺便说一句,在iPad上没有问题,可能是因为UIDocumentPickerViewController被显示为弹出框。

为什么会发生这种情况,我该怎么办?

谢谢!

最佳答案

好吧,我想我已经找到一种解决此问题的方法。 WebKit是开源的,您可以看到有问题的类是WKFileUploadPanel,特别是_dismissDisplayAnimated: method的调用过于激进,无意间触发了视图控制器的关闭。为了避免这种情况,您需要阻止来自-dismissViewControllerAnimated:completion:的对WKFileUploadPanel的调用,您可以通过查找堆栈来进行。这是解决此问题的实现。

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


weak UIDocumentMenuViewController属性添加到您的模式视图控制器类。
在模式类中重写-presentViewController:animated:completion:以检查并查看所显示的视图控制器是否为UIDocumentMenuViewController,如果是,则将其设置为步骤1中您的弱属性的值。
覆盖-dismissViewControllerAnimated:completion:来检查您的弱属性是否是nil,如果它不是nil并且您的模式的presentedViewControllernil,那么这意味着WebKit试图在不应该使用它的情况下解散您的模式。 。您可以避免在这种情况下调用super,否则继续调用它。


您还可以混淆WKFileUploadPanel_dismissDisplayAnimated: method来更加注意自己的视图控制器,但这会带来很大的风险。

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

10-09 22:07