2017-10-04 3 views
4

Je travaille sur une simple application de ligne de commande MacOS dans Swift. J'ai créé un filtre CoreImage personnalisé et j'ai des problèmes pour l'utiliser. Le code compile très bien mais quand il exécute sa sortie avec l'erreur suivante:"Cette classe n'est pas compatible avec le codage de valeur de clé" using CoreImage

*** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[ setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key inputImage.'

Toute aide à ce problème serait grandement apprécié. Je ai essayé de chercher une réponse sur SO, mais comme mon application n'utilise pas Storyboards ou Outlets (c'est pure ligne de commande), malheureusement, je ne pouvais pas m'en empêcher.

Mes pauses programme sur cette ligne:

filter.setValue(inputImage, forKey: kCIInputImageKey) 

Voici le code que je utilise:

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

Vous forcez la sortie d'un objet CIImage avec CIImage! mais en retournant un possible nul, ce qui ne semble pas correct. –

Répondre

12

valeur clé des propriétés de codage conformes doivent être marqués comme dynamic

dynamic var inputImage : CIImage? 

et dans Swift 4 même comme @objc

@objc dynamic var inputImage : CIImage? 
+0

Cela a fonctionné comme un charme, merci. Pouvez-vous expliquer pourquoi il a dû être déclaré comme '@objc dynamic var'? Je suis confus parce que cela ressemblait à une variable standard en classe. – Pono

+1

Veuillez lire la section 'Exiger un envoi dynamique' dans [Utiliser Swift avec Cocoa et Objective-C: Interagir avec les API Objective-C] (https://developer.apple.com/library/content/documentation/Swift/Conceptual/BuildingCocoaApps /InteractWithObjective-CAPIs.html#//apple_ref/doc/uid/TP40014216-CH4-ID35) – vadian

+0

bonne réponse, merci! – SmartTree