我有一个WKWebview加载一个基于Web的UI,我希望用户能够从他们的iCloud文档上传文件。我已授予正确的权限,并且能够浏览iCloud文档。但是,当我选择一个文件或单击取消按钮时,以及文档选择器视图关闭我的 WKWebview 的父视图也会被关闭。
我试图跟踪关闭路径。我 100% 确定我没有根据我的观点调用 dismission 函数。
有没有人知道是什么触发了我的 WKWebview 容器上的关闭以及如何防止它?
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) 在呈现UIDocumentPickerViewController
的UIViewController
上覆盖这两个函数
//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]; } }
-
我们所做的是:
- 当我们要显示文档选取器时,保存一个指向 UIDocumentPickerViewController 的弱指针
- dismissViewControllerAnimated:completition 被调用两次。一次是当呈现的ViewController尚未为零时杀死实际的文档选择器,第二次由于未知原因,当呈现的ViewController消失但UIDocumentPickerViewController仍然活着时。这个想法是防止这第二次关闭传播到超级