2014-08-30 4 views
1

У меня есть этот код в SKScene: «есть»SpriteKit childNodeWithName не может найти существующий узел

override func touchesBegan(touches: NSSet!, withEvent event: UIEvent!) { 

    var touch: AnyObject = touches.anyObject() 
    var point = getPoint(touch.locationInNode(self)) 
    var name = NSStringFromCGPoint(point) 

    for children in self.children { 

     if (children as SKSpriteNode).name == name { 

      println("exist!") 
     } 
    } 
    var tempNode = self.childNodeWithName(name) 
} 

я вижу в журнале, так что в дочернем массиве есть узел с этим именем, но tempNode is nil. Вызов self.childNodeWithName("//" + name) возвращает ноль тоже.

ответ

8

Вот как это сделать в Swift ... Надеюсь, это поможет!

var mySprite: SKSpriteNode = childNodeWithName("mySprite") as SKSpriteNode 
+0

childNodeWithName всегда сбой с фатальной ошибки: неожиданно обнаружил ноль, а разворачивание необязательное значение –

+0

Это может быть связано с несколькими вещами. Там может быть опечатка в строке имени или нужный вам узел, возможно, еще не был инициализирован или, возможно, уже был удален при вызове childNodeWithName. Необязательная цепочка - хороший способ защитить от этого. Попробуйте следующее: 'if let mySprite = childNodeWithName (" mySprite ") { // Сделайте что-то с узлом }' –

0

Я нашел эту странность, используя Swift 2,2, может быть ошибка .. вы не можете использовать NSStringFromCGPoint и childNodeWithName без очистки строки из скобок:

Используя этот метод мало:

func removeBraces(s:String)->String { 
    return s.stringByTrimmingCharactersInSet(NSCharacterSet.init(charactersInString: "{}")) 
} 

когда вы добавите SKSpriteNode сделать, например:

... 
mySpriteNode.name = removeBraces(NSStringFromCGPoint(mySpriteNode.position)) 
... 

и получить его для вашего случая:

override func touchesBegan(touches: NSSet!, withEvent event: UIEvent!) { 

    var touch: AnyObject = touches.anyObject() 
    var point = getPoint(touch.locationInNode(self)) 
    var name = removeBraces(NSStringFromCGPoint(point)) 
    if let child = self.childNodeWithName(name) { 
     print("I've found: \(child)") 
    } 
    ... 
} 
Смежные вопросы