利用 runtime 监听 WKWebView 打开相册

项目里用 WKWebview 加载的 H5 里面有个头像上传的功能,H5使用了 <input type=file> 标签,可以不经过 iOS 原生处理就能直接打开相机或相册文件选取图片。现在的需求是要原生得到用户选择的图片后进行裁剪,把裁剪后的图片交给 H5 中显示。而 WKWebview 代理并没有提供相关的方法,从网上找到一种解决方法,具体可以看这篇帖子,说的挺详细的。
这里说说遇到的问题,在使用这个帖子的方法的时候,由于webview 放在了 navigationcontroller 里面,最后在自己实现弹出视图的时候方法调取不到。所以要加个判断,代码如下:

- (void)onFileInputIntercept {
    //  当根视图为 UINavigationController 时,需要取出 navigation 对应的控制器
    //  获取 window
    UIWindow *mainWindow = [AppDelegate sharedAppDelegate].window;
    //  如果以导航控制器作为根控制器
    if ([mainWindow.rootViewController isKindOfClass:[UINavigationController class]]) {
        __block NSInteger   index;
        [mainWindow.rootViewController.childViewControllers enumerateObjectsUsingBlock:^(__kindof UIViewController * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
            //  RootViewController 就是放了 webview 的 controller
            if ([obj isKindOfClass:[RootViewController class]]) {
                //  得到对应的控制器在导航控制器中的位置
                index = idx;
            }
        }];
        //  取出对应的控制器来实现方法
        UIViewController *vc = [mainWindow.rootViewController.childViewControllers objectAtIndex:index];
        if ([vc respondsToSelector:@selector(onFileInputClicked)]) {
            [vc performSelector:@selector(onFileInputClicked)];
        }
    }
}

判断完之后,就可以做之后的操作了。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1、通过CocoaPods安装项目名称项目信息 AFNetworking网络请求组件 FMDB本地数据库组件 SD...
    阳明AGI阅读 16,009评论 3 119
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,229评论 4 61
  • 入了伏,又闷又热,安慰自己心静自然凉。不上班休息的时候宅在家里,时间都是自己的,至少在那一段时间之内,这世上真没有...
    蛋黄儿阅读 324评论 0 1
  • 刚刚看完《指数基金投资指南》第一、二章。我是一个完全不懂股票,不懂财经,不懂指数的人,对数字也极度不敏感。...
    韩亚希阅读 194评论 0 1
  • 爱情里你说过什么谎话吗 许诺过什么约期吗 你还记得那些少年少女们吗 你一定不记得了 我们的青春就像个借债的小人儿 ...
    未明花香阅读 119评论 6 4