You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

点击UIButton添加SKShapeNode后无法重复点击移除该节点求助

问题排查与解决方案

我来帮你搞定这个问题——你的代码里有个关键逻辑错误,导致移除节点的操作没生效。

问题根源

每次点击按钮触发buttonAction时,你都会新建一个全新的SKShapeNode实例:

  • 第一次点击:你创建了节点A,把它添加到了spriteScene里
  • 第二次点击:你又创建了完全无关的节点B,然后调用nodeB.removeFromParent()——但这个节点B根本没被添加到场景中,自然看不到任何移除效果

简单说:你要移除的不是之前添加的那个节点,而是一个刚创建的“空节点”。

修复方案

把SKShapeNode定义为类的成员变量,保存住节点的引用,这样每次点击按钮时操作的都是同一个节点实例。同时可以简化逻辑,不用除法判断,用取模或者直接判断节点状态会更直观。

修改后的完整代码

class myView: UIViewController{
    var spriteScene = SKScene(size: CGSize(width: 500, height: 500))
    var tapCounter: Int = 0
    // 将节点定义为类成员变量,保存引用
    var mySKShapeNode: SKShapeNode?
    
    override func viewDidLoad(){
        super.viewDidLoad()
        
        // 提前初始化节点(也可以在第一次点击时初始化)
        mySKShapeNode = SKShapeNode(rectOf: CGSize(width: 270, height: 15), cornerRadius: 5)
        mySKShapeNode?.fillColor = .white
        mySKShapeNode?.position = CGPoint(x: 240, y: 100)
        
        // 补上你原代码中缺失的button声明
        let button = UIButton(type: .system)
        let xPostion:CGFloat = 40
        let yPostion:CGFloat = 108
        let buttonWidth:CGFloat = 100
        let buttonHeight:CGFloat = 45
        button.frame = CGRect(x:xPostion, y:yPostion, width:buttonWidth, height:buttonHeight)
        button.backgroundColor = UIColor.white
        button.setTitle("Tap me!", for: .normal)
        button.tintColor = UIColor.black
        button.addTarget(self, action: #selector(buttonAction(_:)), for: .touchUpInside)
        self.view.addSubview(button)
    }
    
    @objc func buttonAction(_ sender:UIButton!){
        tapCounter += 1
        // 用取模判断点击次数的奇偶性,比除法更直观
        if tapCounter % 2 == 1 {
            // 奇数点击:添加节点(先判断节点未被添加)
            if let node = mySKShapeNode, node.parent == nil {
                spriteScene.addChild(node)
            }
        } else {
            // 偶数点击:移除节点
            mySKShapeNode?.removeFromParent()
        }
    }
}

更简洁的优化方案(无需计数器)

其实可以完全去掉计数器,直接根据节点的当前状态(是否在父节点中)来决定操作,逻辑更可靠:

@objc func buttonAction(_ sender:UIButton!){
    guard let node = mySKShapeNode else { return }
    if node.parent == nil {
        spriteScene.addChild(node)
    } else {
        node.removeFromParent()
    }
}

内容的提问来源于stack exchange,提问作者AtharvSalokhe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 09:01:50