点击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
相关产品推荐
相关产品推荐

