Средство выбора документов 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]; } }
что мы делаем это:
- когда мы собираемся отобразить средство выбора документа, сохраните слабый указатель на UIDocumentPickerViewController
- dismissViewControllerAnimated: завершение вызывается дважды. Один раз, когда presentViewController еще не равен nil, чтобы убить фактический инструмент выбора документов, и второй раз по неизвестным причинам, когда представленный ViewController исчез, но UIDocumentPickerViewController все еще жив. Идея состоит в том, чтобы предотвратить это 2-е увольнение распространяться на супер