Ios 检测节点的父节点何时更改

Ios 检测节点的父节点何时更改,ios,swift,sprite-kit,Ios,Swift,Sprite Kit,因此,我有一个类,它是SKSpriteNode的子类,我希望当其父节点发生变化时,或者当它没有父节点时,场景会发出警报,以便我知道其容器的大小。我试着做了以下几点: class MyNode: SKSpriteNode { override var parent: SKNode? { didSet { //code here } } override var scene: SKScene? {

因此,我有一个类,它是
SKSpriteNode
的子类,我希望当其父节点发生变化时,或者当它没有父节点时,场景会发出警报,以便我知道其容器的大小。我试着做了以下几点:

class MyNode: SKSpriteNode {

    override var parent: SKNode? {
        didSet {

            //code here

        }
    }

    override var scene: SKScene? {
        didSet {

            //code here

        }
    }

}

但是,我得到了一个错误,
无法观察只读属性“parent”;它不能更改
不能观察只读属性“场景”;它无法更改
,这让我相信在某个地方存在私有值,这些属性是经过计算的。除了在每次将节点添加到其他节点时手动调用函数外,我不知道还能做什么,但我觉得这是一个糟糕的解决方案。感谢您的帮助,如果解决方案显而易见,请道歉;我对SpriteKit相当陌生。

您正在为检测设置类属性,我认为在初始化类时不允许更改这些属性。我建议签入一个游戏循环函数,如
didFinishUpdate
。然后,您将能够检查每个帧并执行正确的操作。

您正在为检测设置类属性,我认为在初始化类时不允许更改这些属性。我建议签入一个游戏循环函数,如
didFinishUpdate
。然后,您将能够检查每一帧并执行正确的操作。

我所做的是对
SKScene
进行扩展:

import Foundation
import SpriteKit

extension SKScene {

    override public func addChild(node: SKNode) {

        super.addChild(node)

        if let myNode = node as? MyNode {

            myNode.containerSize = self.size

        }

    }

}
对于
SKSpriteNode

import Foundation
import SpriteKit

extension SKSpriteNode {

    override public func addChild(node: SKNode) {

        super.addChild(node)

        if let myNode = node as? MyNode {

            myNode.containerSize = self.size

        }

    }

}

我所做的是为
SKScene
做扩展:

import Foundation
import SpriteKit

extension SKScene {

    override public func addChild(node: SKNode) {

        super.addChild(node)

        if let myNode = node as? MyNode {

            myNode.containerSize = self.size

        }

    }

}
对于
SKSpriteNode

import Foundation
import SpriteKit

extension SKSpriteNode {

    override public func addChild(node: SKNode) {

        super.addChild(node)

        if let myNode = node as? MyNode {

            myNode.containerSize = self.size

        }

    }

}

谢谢你的提示,但我刚刚找到了另一个似乎有效的解决方案。我所做的是对
SKScene
SKSpriteNode
进行扩展,并且在每个扩展中我都覆盖了
addChild
。然后在
addChild
中,调用超级函数后,我检查了传递到函数中的节点的类型,看看它是否是
MyNode
。很好,是的,这确实是一个解决方案。你是在检查多个节点吗?你说的“检查多个节点”是什么意思?你是在检查相同类型的多个节点是否更改了父节点吗?每次节点更改父节点时都应该进行检查谢谢你的提示,但我刚刚找到另一个似乎有效的解决方案。我所做的是对
SKScene
SKSpriteNode
进行扩展,并且在每个扩展中我都覆盖了
addChild
。然后在
addChild
中,调用超级函数后,我检查了传递到函数中的节点的类型,看看它是否是
MyNode
。很好,是的,这确实是一个解决方案。你在检查多个节点吗?你说的“检查多个节点”是什么意思?你在检查相同类型的多个节点是否更改了父节点吗?每次节点更改父节点时都应该进行检查这是最好的解决方案:
parent
是只读的,没有setter,因此你不能用
didSet
观察它。但是正是方法
addChild()
间接地导致了
parent
的值的更改。如果唯一的问题是设置容器大小,为什么还要麻烦呢?只要让containerSize成为一个属性
var containerSize:CGSize{get{return parent?.size??CGSizeZero}
@Knight0fDragon我有一个属性观察器,它可以执行我想要的操作这是最好的解决方案:
parent
是只读的,没有setter,所以你不能用
didSet
观察它。但是正是方法
addChild()
间接地导致了
parent
的值的更改。如果唯一的问题是设置容器大小,为什么还要麻烦呢?只要让containerSize成为一个属性
var containerSize:CGSize{get{return parent?.size??CGSizeZero}}
@Knight0fDragon我有一个属性观察器,它执行我想要的操作