Средство выбора документов iCLoud из WKWebview, отклоняющее представление контейнера

У меня есть WKWebview, загружающий веб-интерфейс, где я хотел бы, чтобы пользователи могли загружать файлы из своих документов iCloud. Я предоставил правильные разрешения и могу просматривать документы iCloud. Однако, когда я выбираю файл или нажимаю кнопку отмены, а также представление средства выбора документа, отклоняющее родительское представление моего WKWebview, также отклоняется.

Я пытался отследить путь увольнения. Я уверен на 100%, что не вызываю функцию dismiss на мой взгляд.

Кто-нибудь имеет какие-либо идеи, что вызывает увольнение на моем контейнере WKWebview и как это предотвратить?

2 ответа

В баге есть ошибка UIDocumentPickerViewController,

1) Сохранить слабую ссылку на UIDocumentPickerViewController внутри того, что когда-либо вид контроллера представляет UIDocumentPickerViewController, (Это обычно заканчивается 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) Переопределите эти две функции на UIViewController что представляет 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)
}

Теперь второй звонок от UIDocumentPickerViewController не отклонит представление UIViewController,

У меня была та же проблема на Objective-C и iOS11 с WKWebView, и я решил ее, используя этот обходной путь. Вы должны легко перенести его в 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: завершение вызывается дважды. Один раз, когда presentViewController еще не равен nil, чтобы убить фактический инструмент выбора документов, и второй раз по неизвестным причинам, когда представленный ViewController исчез, но UIDocumentPickerViewController все еще жив. Идея состоит в том, чтобы предотвратить это 2-е увольнение распространяться на супер
Другие вопросы по тегам