SpriteKit childNodeWithName не может найти существующий узел

У меня есть этот код в SKScene:

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 равен нолю. self.childNodeWithName("//" + name)call также возвращает ноль.


person Valeriy    schedule 30.08.2014    source источник


Ответы (2)


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

var mySprite: SKSpriteNode = childNodeWithName("mySprite") as SKSpriteNode
person Thomas Jeans    schedule 04.11.2014
comment
childNodeWithName всегда завершается сбоем с фатальной ошибкой: неожиданно найдено nil при развертывании необязательного значения - person Alessandro Ornano; 29.03.2016
comment
Это может быть связано с несколькими вещами. В строке имени может быть опечатка, или искомый узел может быть еще не инициализирован или уже удален при вызове childNodeWithName. Необязательная цепочка — хороший способ защититься от этого. Попробуйте это: if let mySprite = childNodeWithName("mySprite") { // Do something with the node } - person Thomas Jeans; 30.03.2016
comment
Swift 4 var mySprite: SKSpriteNode = childNode(withName: mySprite) as! SKSpriteNode - person uplearnedu.com; 21.03.2018

Я нашел эту странность, используя 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)")
    }
    ...
}
person Alessandro Ornano    schedule 29.03.2016