【问题标题】:SKScene? does not have a member named "Generator"SK场景?没有名为“生成器”的成员
【发布时间】:2026-01-07 02:55:02
【问题描述】:

我添加了 3 个这样的 skspritenode:

var node = SKSpriteNode(imageNamed:"node1")

func addnode(){

node = SKSpriteNode(imageNamed:"node1")
node.position = CGPointMake(frame.size.width/3, frame.size.height/3)
node.size = CGSizeMake(frame.size.width/10, frame.size.height/10)
addChild(node)
node = SKSpriteNode(imageNamed:"node1")
node.position = CGPointMake(frame.size.width/5, frame.size.height/5)
node.size = CGSizeMake(frame.size.width/10, frame.size.height/10)
addChild(node)
node = SKSpriteNode(imageNamed:"node1")
node.position = CGPointMake(frame.size.width/2, frame.size.height/2)
node.size = CGSizeMake(frame.size.width/10, frame.size.height/10)
addChild(node)
}

(我创建了 25 个这样的节点,但为了便于解释,我做了 3 个)

现在,当我使用 removeAllChildren() 删除这些节点时,它们会被缓慢删除,因为它们都具有相同的名称,因此每个节点都删除了 1 个。 我想用“for”函数一次性删除它们。

我试过了:

let aa = levelnode as SKSpriteNode
    for aa in scene{
        levelnode.removeFromParent
    }

但我收到此错误:SKScene?没有名为“生成器”的成员

用for函数删除节点的正确方法是什么?

编辑:

override func willMoveFromView(view: SKView) {

 removeAllChildren()

}

我在以下行尝试了这个错误:

override func willMoveFromView(view: SKView) {
    let aa = levelnode as SKSpriteNode
    for levelnode in scene?.children{  // "$T4??" does not have a member named "Generator"
        levelnode.removeFromparent
    }
 removeAllChildren()

}

【问题讨论】:

    标签: ios xcode swift skscene


    【解决方案1】:

    您可能想看看以下类引用:

    SKNode : http://goo.gl/XkWckI

    SKSpriteNode : http://goo.gl/XFyUwb

    SKScene : http://goo.gl/ZvOMZv

    从那里有两句话:

    • “它们都具有相同的名称”:实际上,它们都没有名称(您没有设置名称属性);
    • “removeAllChildren(),它们会慢慢被移除”:如果你在场景中运行过这个方法,它应该可以工作。但我不明白为什么它会很慢,也许给我们你用过的行代码(以及在哪里)?

    之后,有几种方法可以从场景或另一个节点中删除节点。您尝试过的部分是其中之一(如果已设置,您可以按名称查找孩子,等等...)。但是如果我们想坚持你所尝试的,你会得到一个错误,因为你试图迭代错误的对象。实际上,您要做的是在场景子节点scene.children 上循环。

    有了所有这些,您可能想再试一次。

    我希望它有所帮助。如果没有,请在评论中提供更多详细信息。

    编辑:

    self 是场景:

    self.removeAllChildren()
    

    for node in self.children {
        self.removeChildrenInArray([node])
    }
    

    都是一样的。

    我对你所面临的缓慢的猜测是你在willMoveFromView: 方法中调用它。我想你正在尝试加载相同的场景,所以你可能也不想这样做:在你进入下一个场景之前删除它们(即在你使用 presentScene 之前)或者在你进入下一个场景之后删除它们场景(即在didMoveToView 内部)。但是,如果您在开始时正确设置了场景,您甚至不必这样做(否则我可能错过了一些东西)。

    【讨论】: