2016-03-30 83 views
0

我试图让我的SKNode具有一个值,可以从中获取值以获取值。它就像名称属性(skspritenode.name),但我想能够有布尔值是值。如何为密钥创建一个值

这就是我试图创造这个价值的方法。

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

然后,当我试图访问它,我用这个

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

我难倒。有什么建议么? 如果这有点令人困惑,我很抱歉。我不善于解释简单的事情。

+0

请告诉我这个问题? –

回答

1

问题是is_Block在SKNode上不存在。

setValue forUndefinedKey默认会引发NSUndefinedKeyException。

如果你有一个子类,你可以重载这个函数来做你想做的事情。

请参阅https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/KeyValueCoding/Articles/BasicPrinciples.html以更好地理解关键值编码。

如果你想SKNode有一个名为is_Block的自定义变量,你将不得不为SKNode创建一个扩展,并创建一个属性为你存储这些数据。

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) 
     } 
    } 

} 

测试在操场:

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

我认为子类化是更好的选择。通过'obj_xxxAssociatedObject'添加的'var'将像'static'一样工作。意味着每个实例都将分享价值。 – Ryan

+0

是的,忘记了那部分,我这样做时使用了一个唯一的标识符 – Knight0fDragon

+0

等待,不要介意@ trick14,实例不共享值,因为它是通过键和对象关联的,而不仅仅是键,因此'自我'作为第一个参数。我正在想别的东西。 – Knight0fDragon

相关问题