当 webview 呈现 ImagePicker 时未调用 presentViewController

Posted

技术标签:

【中文标题】当 webview 呈现 ImagePicker 时未调用 presentViewController【英文标题】:presentViewController not called when webview presents ImagePicker 【发布时间】:2018-08-09 19:06:42 【问题描述】:

我看到了几个问题,由于 UIWebView 调用它,所以在显示 imagepicker 时应该调用函数 presentViewController:(UIViewController *)viewControllerToPresent animated:(BOOL)flag completion:(void (^)(void))completion

这是我的代码。

- (void)presentViewController:(UIViewController *)viewControllerToPresent animated:(BOOL)flag completion:(void (^)(void))completion

   if([viewControllerToPresent.class isEqual:[UIImagePickerController class]])
       UIImagePickerController *controller = (UIImagePickerController*)viewControllerToPresent;

       controller.navigationBar.tintColor = UIColor.whiteColor;
       [controller.navigationBar setTitleTextAttributes:
        @NSForegroundColorAttributeName:[UIColor whiteColor]];
       [controller.navigationBar setBackgroundImage:nil forBarMetrics:UIBarMetricsDefault];
       [controller.navigationBar setBarTintColor:[UIColor blackColor]];
   

   [super presentViewController:viewControllerToPresent animated:flag completion:completion];

【问题讨论】:

【参考方案1】:

当您在 Web 视图中使用 <input type="file"> 标记并单击结果按钮时,保存您的 Web 视图的 ViewController 将调用该方法。

这个方法已经在UIViewController 中实现了,但是如果你想覆盖它,你可以在你的UIViewController 子类上这样做。迅速:

override func present(_ viewControllerToPresent: UIViewController, animated flag: Bool, completion: (() -> Void)? = nil) 
        super.present(viewControllerToPresent, animated: flag, completion: completion)
    

在 Objective-C 中:

- (void)presentViewController:(UIViewController *)viewControllerToPresent animated:(BOOL)flag completion:(void (^)(void))completion 
    [super presentViewController:viewControllerToPresent animated:flag completion:completion];

值得注意的是,当我在 ios11 模拟器上测试时显示的控制器不是 UIImagePickerController,而是实际上是 UIDocumentMenuViewController,因此您上面的自定义代码将不起作用。

另外,请注意,您不应该再使用UIWebView。你应该改用WKWebView

【讨论】:

两件事,当我使用 WKWebview 时,我的 imagepicker 控制器没有完成按钮,所以我切换回 uiwebview,WKWebview 也有很多关于 cookie 的问题,并且没有让我的用户登录其次,在呈现 2 个选项时会显示 UIDoucmentController,而不是单击照片库后,会显示一个图像选择器。当通过 uiwebview 单击 时,永远不会调用覆盖函数 presentViewController。 UIWebView 即将消失。您需要找到一种使用 WKWebView 的方法。至于调用,您在选择时看不到调用,因为它是在 UIDocumentMenuViewController 上而不是在您的 VC 上调用的。 YourVC 展示了 UIDocumentMenuViewController,它展示了 UIImagePickerController。【参考方案2】:

该事件将在您的 ROOT 视图上调用,该视图可能是也可能不是您的 WebViewController。使用布局检查器查找您的根视图,或以编程方式从应用委托中检索根视图。

【讨论】:

以上是关于当 webview 呈现 ImagePicker 时未调用 presentViewController的主要内容,如果未能解决你的问题,请参考以下文章

在用户交互之前,Android WebView 无法完全呈现内容

如何在 ImagePicker 控制器的单元格类中设置图像

Android:如何在webview中呈现html而不显示webview

当数据大小增加到超过 5100 个字符时,Android WebView 不显示

如何避免缩放android webview

保存在 webView 中呈现的可编辑文本