我正在使用swift开发一个应用程序。我为此创建了SCNNode的子类:
class Charge: SCNNode {
static var tagCounter = 0 //to give every charge a unique tag
static var charges = [Charge]() //to have a pointer that can access all charges
static var selectedCharge: Charge? //pointer to selected charge
override init() {
super.init()
super.geometry = Charge.carbonAtom()
Charge.tagCounter++
self.chargeTag = Charge.tagCounter
Charge.charges.append(self)
}
}
然后在ViewController中多次启动该类之后,我想使用Charge.charges
访问它们。但由于某些未知原因,只有最后一个实例可用,并且它占用Charge.charges[0]
。
我尝试通过在ViewController var test = [Charge]()
中添加属性来跟踪对象移动,并在每次在ViewController中启动时调用test.append(charge)
。然后,当我想要访问所有费用时,Charge.charges
会丢失大部分费用,但test
却没有!任何人都可以启发我吗?或者它是Xcode中的错误?
n.b。我使用调试工具来跟踪这个问题。事实证明,Charge.charges
在第二次初始化完成后立即丢失其第一个内容,但第一个内容在执行Charge.charges.append(self)
之后仍然存在
编辑:carbonAtom功能
class func carbonAtom() -> SCNGeometry {
let carbonAtom = SCNSphere(radius: 0.8)
carbonAtom.firstMaterial!.diffuse.contents = UIColor.redColor()
carbonAtom.firstMaterial!.specular.contents = UIColor.whiteColor()
return carbonAtom
}
答案 0 :(得分:3)
我刚刚测试过,没有任何Xcode错误。
class Charge: NSObject {
static var tagCounter = 0 //to give every charge a unique tag
static var charges = [Charge]() //to have a pointer that can access all charges
override init() {
super.init()
// super.geometry = Charge.carbonAtom()
Charge.tagCounter++
// self.chargeTag = Charge.tagCounter
Charge.charges.append(self)
}
}
创建3个Change
实例:
for var i = 0; i < 3; i++ {
_ = Charge()
}
print(Charge.charges.count)
控制台打印3
。
尝试检查您的Charge.carbonAtom()
静态方法。我怀疑charges
数组的值是否清楚。
答案 1 :(得分:0)
OKAY GUYS我找到了它!
在Charge类中有一些我不提供的信息(我认为这是无关紧要的):
override func removeFromParentNode() {
super.removeFromParentNode()
for var i = 0; i<Charge.charges.count; i++ {
let charge = Charge.charges[i]
if Charge.selectedCharge != nil {
if charge == Charge.selectedCharge! {
Charge.charges.removeAtIndex(i)
}
}
break
}
}
并在ViewController中
@IBAction func addCharge(sender: AnyObject) {
let charge = Charge()
scene.rootNode.addChildNode(charge) //root of problem
Charge.selectedCharge = charge
print(Charge.charges.count)
}
在scene.rootNode.addChildNode(charge)
行中,该方法会自动从removeFromParentNode()
调用charge
。因此,当第二次充电初始化时,Charge.selectedCharge
指向的费用将从Charge.charges
中删除。
我尝试在Apple文档中搜索此信息,但无济于事。如果只是他们更全面地记录它:/
谢谢你们的帮助:)我用来复制bug的分而治之的方法确实有助于缩小问题范围