2016-04-15 8 views
-1

Ich habe folgende VC:Fehler beim Aufruf self.setValue (: :) forKey

class ViewController: UIViewController { 
    var platforms = [Platform]() 

    viewDidLoad() { 
     let newPlatforms = [Platform(0), Platform(1)] 
     self.setValue(newPlatforms, forKey: "platforms") 
    } 
} 

aber wenn betreibe ich bekommen, dass Crash-Fehler:

Terminating app due to uncaught exception 'NSUnknownKeyException', reason: this class is not key value coding-compliant for the key platforms

aber es ist ok, wenn ich verwende, zum Beispiel String-Variable

class ViewController: UIViewController { 
    var string = "" 

    viewDidLoad() { 
     let newString = "Hello world" 
     self.setValue(newString, forKey: "string") 
    } 
} 

Ich brauche wirklich diesen Schlüssel-Wert-Codierungsmechanismus. Das Beispiel wurde besonders vereinfacht.

+0

Warum verwenden Sie 'setValue (_: forKey:)'? – nhgrif

+1

Nach diesem Artikel muss der beobachtete Wert ("platforms") von NSObject erben, und da ein Swift-Array nicht einmal eine Klasse ist, ist es eine Struktur, die möglicherweise nicht beobachtet werden kann. https://medium.com/proto-venture-technology/the-state-of-kvo-in-swift-aa5cb1e05cba#.tse34ddpo – EmilioPelaez

Antwort

1

platforms ist ein Array (!), ist diese einfache Syntax das Array zu setzen

class ViewController: UIViewController { 
    var platforms = [Platform]() 

    viewDidLoad() { 
     let newPlatforms = [Platform(0), Platform(1)] 
     platforms = newPlatforms 
    } 
} 

self ist nicht erforderlich verwenden.


Oder im zweiten Beispiel ein String

string = newString 

verwendet Grundsätzlich nicht valueForKey:/setValue:forKey: zugewiesen werden, wenn Sie wirklich den KVC (Schlüssel-Wert-Codierung) Funktionalität benötigen.

+0

ich wirklich KVC verwenden müssen. Beispiel ist speziell zur Demonstration vereinfacht. –

0

self bezieht sich derzeit auf ViewController. Sie sollten das Wörterbuch zum Speichern von Schlüssel/Wert-Paaren verwenden.

0
var optionDictionary : NSMutableDictionary! 
optionDictionary.setValue(newPlatforms, forKey: "platforms") //or setObject if value is not work. 

Versuchen Sie es. hoffen, dass dies funktionieren wird :)