来自 WKWebview 的 iCLoud 文档选取器关闭容器视图



我有一个WKWebview加载一个基于Web的UI,我希望用户能够从他们的iCloud文档上传文件。我已授予正确的权限,并且能够浏览iCloud文档。但是,当我选择一个文件或单击取消按钮时,以及文档选择器视图关闭我的 WKWebview 的父视图也会被关闭。

我试图跟踪关闭路径。我 100% 确定我没有根据我的观点调用 dismission 函数。

有没有人知道是什么触发了我的 WKWebview 容器上的关闭以及如何防止它?

UIDocumentPickerViewController 中存在一个错误。

1)将弱引用保存在视图控制器呈现UIDocumentPickerViewControllerUIDocumentPickerViewController内。(这通常最终会成为UINavigationController因此您可能需要UINavigationController子类来解决此问题。

///Due to a bug in UIDocumentPickerViewController we need to stop the UIDocumentPickerViewController from dismissing this navigation controller. Or at least provide control. This is a weak reference to a UIDocumentPickerController that this controller presents
weak var documentPicker: UIDocumentPickerViewController?

2) 在呈现UIDocumentPickerViewControllerUIViewController上覆盖这两个函数

//MARK: Overrides
override public func dismiss(animated flag: Bool, completion: (() -> Void)? = nil) {
    if self.presentedViewController == nil && self.documentPicker != nil {
        self.documentPicker = nil
    }else{
        super.dismiss(animated: flag, completion: completion)
    }
}
public override func present(_ viewControllerToPresent: UIViewController, animated flag: Bool, completion: (() -> Void)? = nil) {
    if viewControllerToPresent is UIDocumentPickerViewController {
        self.documentPicker = viewControllerToPresent as? UIDocumentPickerViewController
    }
    super.present(viewControllerToPresent, animated: flag, completion: completion)
}

现在,UIDocumentPickerViewController的第二个电话不会驳回呈现UIViewController

我在带有WKWebView的Objective-C和iOS11上遇到了同样的问题,并使用此解决方法解决了它。您应该能够轻松地将其迁移到 Swift :

  • 我的WKWebView由直接扩展UIViewController的视图控制器拥有
  • 在此视图控制器中添加此弱属性

    @property (weak, nonatomic) UIDocumentPickerViewController *_Nullable docPickerPtr;

  • 在同一视图控制器中重写这两个方法,这两个方法最初是UIViewController基类的一部分

    - (void)presentViewController:(UIViewController *)viewControllerToPresent animated: (BOOL)flag completion:(void (^ __nullable)(void))completion
    {
        if ([viewControllerToPresent isKindOfClass:[UIDocumentPickerViewController class]])
        {
            _docPickerPtr = (UIDocumentPickerViewController*)viewControllerToPresent;
        }
        [super presentViewController:viewControllerToPresent animated:flag completion:completion];
    }
    - (void)dismissViewControllerAnimated:(BOOL)flag
                               completion:(void (^)(void))completion
    {
        if (_docPickerPtr != nil && self.presentedViewController == nil)
        {
            NSLog(@">>>>>>>>>>>>PREVENT FROM DOING 2nd DISMISS!");
        }
        else
        {    
            [super dismissViewControllerAnimated:flag completion:completion];
        }
    }
    
  • 我们所做的是:

    1. 当我们要显示文档选取器时,保存一个指向 UIDocumentPickerViewController 的弱指针
    2. dismissViewControllerAnimated:completition 被调用两次。一次是当呈现的ViewController尚未为零时杀死实际的文档选择器,第二次由于未知原因,当呈现的ViewController消失但UIDocumentPickerViewController仍然活着时。这个想法是防止这第二次关闭传播到超级

最新更新