iCLoud document picker from WKWebview dismissing container view

岁酱吖の 提交于 2019-12-04 14:46:09

I had the same problem on Objective-C and iOS11 with WKWebView and solved it using this workaround. You should be able to migrate it to Swift easily :

  • my WKWebView was owned by a view controller directly extending UIViewController
  • inside this view controller add this weak property

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

  • inside same view controller override these two methods originally part of the UIViewController base class

    - (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];
        }
    }
    
  • what we do is :

    1. when we're about to display the document picker, save a weak pointer to the UIDocumentPickerViewController
    2. the dismissViewControllerAnimated:completition gets called twice. Once while the presentedViewController is not nil yet to kill the actual document picker, and a 2nd time for unknown reasons when presentedViewController is gone but UIDocumentPickerViewController is still alive. The idea is to prevent this 2nd dismiss propagate to super

There is a bug in UIDocumentPickerViewController.

1) Save weak reference to UIDocumentPickerViewController inside what ever view controller presents the UIDocumentPickerViewController. (This usually end up being a UINavigationController so you will probably have to subclass UINavigationController to fix this.)

///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) Override these two functions on the UIViewController that is presenting the UIDocumentPickerViewController

//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)
}

Now the second call from the UIDocumentPickerViewController will not dismiss the presenting UIViewController.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!