2016-03-30 22 views
0

SKNode'umun bir değer elde etmek için erişebildiğim bir değere sahip olmasını sağlamaya çalışıyorum. Onun adı özelliği gibi (skspritenode.name) ama ben booleans değeri olmak mümkün olmak istiyorum.Anahtar için bir değer nasıl oluşturulur

bu özelliktir değer yaratmak çalışıyorum nasıl. Bunu erişmeye çalıştığınızda

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

Sonra stumped bu

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

kullanın. Baska öneri? Bu biraz kafa karıştırıcı ise özür dilerim. Basit şeyleri açıklamakta iyi değilim.

+0

nedir problem? –

cevap

1

konu is_Block SKNode mevcut olmamasıdır.

setValue forUndefinedKey

varsayılan olarak NSUndefinedKeyException yükseltecektir. Eğer bir alt sınıfı olsaydı

, size ne yapmak istediğinizi yapmak için bu işlevi geçersiz kılar.

https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/KeyValueCoding/Articles/BasicPrinciples.html daha iyi anahtar değeri kodlama anlamak bakın.

Eğer SKNode olmasını istiyorsanız

is_Block adlı özel değişkeni, sen SKNode için bir uzantısı oluşturmak ve sizin için bu verileri depolayacak bir özellik oluşturmak zorunda olacak sahiptir. oyun alanında

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

} 

Testi:

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

Alt sınıflamanın daha iyi bir seçenek olduğunu düşünüyorum. Obj_xxxAssociatedObject öğesindeki 'var' üzerinden eklenen 'statik' gibi çalışır. Her örnek, değeri paylaşacak anlamına gelir. – Ryan

+0

Evet, bu bölümü unuttuğumda, bu şekilde yaptığımda benzersiz bir tanımlayıcı kullanıyorum – Knight0fDragon

+0

bekle, @ trick14'e aldırış etmeyin, örnekler anahtar ve nesne ile değil, yalnızca anahtarla ilişkilendirildiği için değeri paylaşmıyor. İlk parametre olarak 'kendini'. Başka bir şey düşünüyordum. – Knight0fDragon

İlgili konular