来自 WKWebview 的 iCLoud 文档选择器关闭容器视图
Posted
技术标签:
【中文标题】来自 WKWebview 的 iCLoud 文档选择器关闭容器视图【英文标题】:iCLoud document picker from WKWebview dismissing container view 【发布时间】:2017-10-06 10:30:14 【问题描述】:我有一个加载基于 Web 的 UI 的 WKWebview,我希望用户能够从他们的 iCloud 文档上传文件。我已授予正确的权限,并且能够浏览 iCloud 文档。但是,当我选择一个文件或单击取消按钮时,以及关闭 WKWebview 的父视图的文档选择器视图也会被关闭。
我已尝试跟踪解雇路径。我 100% 确定我没有在视图中调用关闭函数。
有谁知道是什么触发了我的 WKWebview 容器的关闭以及如何防止它?
【问题讨论】:
【参考方案1】: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
。
【讨论】:
由于同样的错误,除了图像选择器发现 UIWebViews 对于 Content-Type 标头默认为 application/x-www-form-urlencoded 而 WKWebViews 没有。终于让我的 shizz 工作了,对此感到高兴,尝试使用 shiggles 的文档选择器,并发现这里存在相同的错误,只是没有修补(尽管恰好今天最后一次评论!很快修复?) .把我的脸拍在桌子上,决定看看我能找到什么解决方法。你是天赐之物。【参考方案2】:我在使用 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:completion 被调用了两次。一次,当presentedViewController 还没有杀死实际的文档选择器时,第二次由于未知原因,当presentedViewController 消失但UIDocumentPickerViewController 仍然存在时。这个想法是为了防止第二次解雇传播到超级
【讨论】:
您好,感谢您的回答!我看到它与几个月前发布的另一个答案的概念相同,只是没有使用标记语言。我也在使用 Swift,但应该归功于它:)以上是关于来自 WKWebview 的 iCLoud 文档选择器关闭容器视图的主要内容,如果未能解决你的问题,请参考以下文章
是否可以使用 CloudKit 从 iCloud 驱动器获取数据
如何检测 WKWebView 正在关闭,来自 javascript