2016-03-30 19 views
0

Ich versuche, meinen SKNode einen Wert für Schlüssel zu haben, auf den ich zugreifen kann, um einen Wert zu erhalten. Es ist genau wie die Eigenschaft name (skspritenode.name), aber ich möchte in der Lage sein, booleans den Wert zu haben.So erstellen Sie einen Wert für Schlüssel

So versuche ich diesen Wert zu erstellen.

block.setValue(false, forUndefinedKey: "is-Block") 

Dann, wenn ich versuchen, darauf zuzugreifen Ich benutze diese

if block.valueForKey("is_Block") == true { 
    //run code here 
} 

ich ratlos bin. Irgendwelche Vorschläge? Ich entschuldige mich, wenn das ein wenig verwirrend ist. Ich bin nicht gut darin, einfache Dinge zu erklären.

+0

Was ist das Problem? –

Antwort

1

Das Problem ist, dass is_Block nicht auf SKNode existiert.

setValue forUndefinedKey wird NSUndefinedKeyException standardmäßig ausgelöst.

Wenn Sie eine Unterklasse hatten, würden Sie diese Funktion überschreiben, um das zu tun, was Sie tun möchten.

Siehe https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/KeyValueCoding/Articles/BasicPrinciples.html, um Schlüsselwertcodierung besser zu verstehen.

Wenn SKNode eine benutzerdefinierte Variable namens is_Block haben soll, müssen Sie eine Erweiterung für SKNode erstellen und eine Eigenschaft erstellen, die diese Daten für Sie speichert.

import Foundation 
import SpriteKit 
import ObjectiveC 

extension SKNode{ 
    var isBlock: Bool { 
     get { 
      var key = "isBlock"; 

      guard let block = objc_getAssociatedObject(self, &key) as? Bool 
      else{ 
       print("Error"); 
       return false 
      } 
      print("Success"); 
      return block 
     } 
     set(newValue) { 
      var key = "isBlock"; 
      print("Setting \(newValue)") 
      objc_setAssociatedObject(self, &key, newValue , objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN) 
     } 
    } 

} 

-Test auf dem Spielplatz:

import Foundation 
import SpriteKit 
import ObjectiveC 

extension SKNode{ 
    var isBlock: Bool { 
     get { 
      var key = "isBlock"; 

      guard let block = objc_getAssociatedObject(self, &key) as? Bool 
      else{ 
       print("Error"); 
       return false 
      } 
      print("Success"); 
      return block 
     } 
     set(newValue) { 
      var key = "isBlock"; 
      print("Setting \(newValue)") 
      objc_setAssociatedObject(self, &key, newValue , objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN) 
     } 
    } 

} 


let a = SKNode() 
let b = SKNode() 

a.isBlock = false 
b.isBlock = true 
print ("\(a.isBlock), \(b.isBlock)")  

b.isBlock = false 
a.isBlock = true 
print ("\(b.isBlock), \(a.isBlock)") 
+0

Ich denke Subclassing ist die bessere Option. Die hinzugefügte 'var' durch' obj_xxxAssociatedObject' funktioniert wie 'statisch'. Bedeutet, dass jede Instanz den Wert teilt. – Ryan

+0

Ja, vergaß diesen Teil, ich benutze eine eindeutige Kennung, wenn es auf diese Weise – Knight0fDragon

+0

warte, egal @ Trick14, die Instanzen teilen nicht den Wert, weil es durch Schlüssel und Objekt, nicht nur den Schlüssel, daher zugeordnet ist "Selbst" als der erste Parameter. Ich dachte an etwas anderes. – Knight0fDragon

Verwandte Themen