“该类不是键值编码兼容的”使用CoreImage
我工作在斯威夫特一个简单的MacOS 命令行应用。我创建了一个定制的CoreImage过滤器,并且遇到了麻烦。该代码编译得很好,但运行时它退出,出现以下错误:“该类不是键值编码兼容的”使用CoreImage
*** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[ setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key inputImage.'
任何有关这个问题的帮助将不胜感激。试图在SO上搜索答案,但由于我的应用程序没有使用Storyboard或Outlets(这是纯粹的命令行),不幸的是我无法自拔。在这条线上
我的程序中断:
filter.setValue(inputImage, forKey: kCIInputImageKey)
下面是我使用的代码:兼容编码
class CustomFilter:CIFilter {
var inputImage:CIImage?
let kernelString = CIKernel(string:
"kernel vec4 chromaKey(__sample s) { \n" +
" vec4 newPixel = s.rgba;" +
" newPixel[0] = 0.0;" +
" newPixel[2] = newPixel[2]/2.0;" +
" return newPixel;\n" +
"}"
)
override var outputImage:CIImage! {
guard
let inputImage = inputImage
else {
return nil
}
let extent = inputImage.extent
let blur = kernelString?.apply(
withExtent: extent,
roiCallback: {
(index, rect) in
return rect
},
arguments: [inputImage])
return blur!.cropping(to: extent)
}
}
let filter = CustomFilter()
filter.setValue(inputImage, forKey: kCIInputImageKey) // it breaks here
guard
let result = filter.outputImage
else {
return nil
}
return result
Key值的属性必须被标记为dynamic
dynamic var inputImage : CIImage?
和Swift 4中,即使是@objc
@objc dynamic var inputImage : CIImage?
这就像一个魅力,谢谢你。你能解释为什么它必须被声明为'@objc dynamic var'吗?我很困惑,因为这看起来像一个标准的课堂变量。 – Pono
请阅读部分'中[使用与斯威夫特可可和Objective-C:与目标C的API相互作用]需要动态Dispatch'(https://developer.apple.com/library/content/documentation/Swift/Conceptual/BuildingCocoaApps /InteractingWithObjective-CAPIs.html#//apple_ref/doc/uid/TP40014216-CH4-ID35) – vadian
很好的答案,谢谢! – SmartTree
您是力输出与CIImage一个CIImage对象!但返回可能的零,这看起来不正确。 –