removeFromParent() 奇怪的行为

Posted

技术标签:

【中文标题】removeFromParent() 奇怪的行为【英文标题】:removeFromParent() strange behavior 【发布时间】:2018-02-28 12:34:06 【问题描述】:

我对函数 removeFromParent 有非常奇怪的行为

lazy var buttonAds: SKSpriteNode = 
  let n = SKSpriteNode(imageNamed: "ButtonAds")
  n.position = CGPoint(x: size.width / 2, y: 600)
  n.zPosition = 100
  n.setScale(1.4)
  return n
()

didMove(...) 中使用addChild(buttonAds) 添加此按钮,在touchesBegan 中添加后者:

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) 
  let touch = touches.first!

  if buttonAds.contains(touch.location(in: self)) 
    // ...
    doAds()
    buttonAds.removeFromParent()
  

如果您点击广告按钮,将被删除,但如果再次点击该位置,这将再次调用函数doAds()...奇怪,场景中不存在buttonAd。

首字母:

点击后:

谢谢

【问题讨论】:

【参考方案1】:

您要做的是检查您触摸的节点是否属于应有的类型。将您的代码更改为:

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) 
    let touch = touches.first!
    if nodeAtPoint(touch.locationInNode(self)) == buttonAds 
        doAds()
        buttonAds.removeFromParent()
    

这应该可以解决问题!

编辑:至于为什么这样做,您正在从场景中删除节点,但它仍然是内存中的一个对象(否则您将无法在其上使用buttonAds.contains(...))所以它仍然有它的存储位置。

【讨论】:

是的,这可以解决问题。对于 Swift4 atPoint(touch.location(in: self))。但是为什么第一个解决方案没有按预期工作:从父级中删除

以上是关于removeFromParent() 奇怪的行为的主要内容,如果未能解决你的问题,请参考以下文章

R中dplyr包中变异函数的奇怪行为

r - ggplot2 - 突出显示选定的点和奇怪的行为

UIPopoverController 奇怪的行为

TableView 中 RadioButton 的奇怪行为

奇怪的 Python 日期比较行为

Flutter:共享首选项的奇怪行为