这个类不符合键值编码规范,使用CoreImage。

14

我正在使用Swift开发一个简单的MacOS命令行应用程序。我创建了一个自定义的CoreImage过滤器,但在使用它时遇到了问题。代码可以成功编译,但运行时却出现以下错误:

*** 因未捕获的异常 'NSUnknownKeyException' 终止应用程序,原因: '[setValue:forUndefinedKey:]: 这个类不支持键值编码的key:inputImage.'

非常感谢任何解决这个问题的帮助。我已经在SO上搜索答案,但由于我的应用程序没有使用Storyboards或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

你正在使用CIImage!强制输出一个CIImage对象,但返回了可能为nil的值,这似乎不太对。 - El Tomato
1个回答

32

键值编码兼容的属性必须标记为 dynamic

dynamic var inputImage : CIImage?

在Swift 4中,甚至可以使用@objc

@objc dynamic var inputImage : CIImage?

非常好,谢谢。您能否解释一下为什么它必须声明为 @objc dynamic var?我感到困惑,因为它看起来像是一个标准的类内变量。 - Pono
1
请阅读使用 Swift 与 Cocoa 和 Objective-C:与 Objective-C API 交互中的“需要动态分派”部分。 - vadian
添加了@objc dynamic但仍然出现错误。请帮忙……@objc dynamic var name: String……让resultPredicate = NSPredicate(format: "name contains[c] %@", s.lowercased()),然后让result = self.videoData.filtered(using: resultPredicate) - kemdo
@kemdo 不要使用 NSPredicate,而是使用本地的 filterrange(of) 选项 diacriticInsensitive - vadian
@vadian,你能提供一些教程吗?谢谢。 - kemdo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接