使用setValue(_,forKey :)和值(forKey :)和CIFilter

时间:2017-10-26 23:12:57

标签: ios swift core-image cifilter setvalue

我已将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
}

0 个答案:

没有答案