2017-10-04 32 views
4

我工作在斯威夫特一个简单的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 
+0

您是力输出与CIImage一个CIImage对象!但返回可能的零,这看起来不正确。 –

回答

12

Key值的属性必须被标记为dynamic

dynamic var inputImage : CIImage? 

和Swift 4中,即使是@objc

@objc dynamic var inputImage : CIImage? 
+0

这就像一个魅力,谢谢你。你能解释为什么它必须被声明为'@objc dynamic var'吗?我很困惑,因为这看起来像一个标准的课堂变量。 – Pono

+1

请阅读部分'中[使用与斯威夫特可可和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

+0

很好的答案,谢谢! – SmartTree

相关问题