美文网首页
Swift iOS8系统版本下,使用CIContext(opti

Swift iOS8系统版本下,使用CIContext(opti

作者: sky_storming | 来源:发表于2019-01-09 14:08 被阅读0次
    问题描述:
    • 在iOS8各系统版本下,Swift中使用 “CIContext(options: nil)” 初始化CIContext,在模拟器运行时直接crash,错误如下:
      reason: '-[CIContext initWithOptions:]: unrecognized selector sent to instance 0x7cc9dcb0'

    • iOS9.0及以上系统这样初始化没问题

    问题解读:

    可能是将Swift方法CIContext(options: [String: Any]?)转换为Objective-C对应的+ (CIContext *)contextWithOptions:(NSDictionary<NSString *,id> *)选项时遇到了一些问题;相反,Swift中它被转换为-[CIContext initWithOptions:],因此无法识别选择器。原文

    解决方案:(两种)
    1. 若初始化时不需要传options参数,则可直接初始化,let context = CIContext();或者区分一下系统版本,iOS9.0以下使用let context = CIContext()方法,iOS9.0及以上使用let context = CIContext(options: nil)方法。
    2. 声明一个Objective-C的CIContext类目,并将初始化方法重新封装成一个类方法,供Swift调用,然后在模块桥接头中导入这个类别,并将原来的初始化方法“CIContext(options: nil)”替换为对类别中的类方法的调用“CIContext.jy_context(options: nil)”。
      类方法示例如下:
    #import <CoreImage/CoreImage.h>
    
    @interface CIContext (Workaround)
    
    + (CIContext *)jy_contextWithOptions:(NSDictionary<NSString *, id> *)options;
    
    @end
    
    #import "CIContext+Workaround.h"
    
    @implementation CIContext (Workaround)
    
    + (CIContext *)jy_contextWithOptions:(NSDictionary<NSString *,id> *)options {
        return [CIContext contextWithOptions:options];
    }
    
    @end
    

    参考:
    StackOverFlow的解决办法
    iOS [CIContext initWithOptions:]: unrecognized selector sent to instance 模拟器 iOS 8.4

    相关文章

      网友评论

          本文标题:Swift iOS8系统版本下,使用CIContext(opti

          本文链接:https://www.haomeiwen.com/subject/yezwrqtx.html