我已将Filterpedia的Swift 3分支代码改编为新的单一视图应用。在Filterpedia项目链接中工作的相同代码工作正常但在我的版本中崩溃。
此代码在我的项目中导致NSException
,但不会导致从中复制的项目:
currentFilter.setValue(640, forKey: "inputHeight")
例外是:
*** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<PerlinMetal.MetalPerlinNoise 0x101612c50> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key inputHeight.'
在我的项目中,currentFilter定义为:
fileprivate var currentFilter = MetalPerlinNoise()
MetalPerlinNoise
与Filterpedia完全相同,并且继承自CIFilter
。
我还试图NSException
尝试访问以下值:
// inputKeys is defined in CIFilter:
open var inputKeys: [String] { get }
for inputKey in inputKeys {
var bufferValue = value(forKey: inputKey) as? Float
}
此代码也适用于Filterpedia,但不适用于我的改编版。它失败并出现与上面类似的NSException:
*** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<PerlinMetal.MetalPerlinNoise 0x137e073c0> valueForUndefinedKey:]: this class is not key value coding-compliant for the key inputWidth.'
编辑:
代码调用值(_,forKey :)与Filterpedia fork相同:
override var outputImage: CIImage!
{
if textureInvalid()
{
self.textureDescriptor = nil
}
if let imageFilter = self as? MetalImageFilter,
let inputImage = imageFilter.inputImage
{
return imageFromComputeShader(width: inputImage.extent.width,
height: inputImage.extent.height,
inputImage: inputImage)
}
if let generatorFilter = self as? MetalGeneratorFilter
{
//This is the line calling the code that crashes attempting to access values by key:
return imageFromComputeShader(width: generatorFilter.outputSize.width,
height: generatorFilter.outputSize.height,
inputImage: nil)
}
return nil
}