在我看来,这似乎是一个巨大的故障。
我有一个覆盖SceneKit场景的SKScene。在我的应用程序中,调用一个方法来更新“进度条”的进度(实际上只是一个高度非常低的SKShapeNode
)。此方法称为updateSaveDataNotification
,并采用NSNotification
。我打电话给[self childNodeWithName:]
来访问子节点。 问题是,当它被调用时,self
没有孩子。即使它真的有三个孩子。
我正在更改我的代码,因此它们是实现中的变量,因此我可以通过这种方式设置其缩放,但为什么这种行为甚至会存在?为什么self
在这种情况下会有零个孩子?
编辑:进度条只是SKShapeNode
。这是我使用的代码:
@implementation {
SKShapeNode *progressBar;
float progress;
}
…
-(void)load {
[[NSNotificationCenter defaultCenter] addObserver:self name:@"anyName" selector:@selector(rcvNotification:) object:nil];
progress = 0.0;
…
progressBar = [SKShapeNode shapeNodeWithRectOfSize:CGSizeMake(self.size.width * 0.9, 2)
progressBar.xScale = 0;
progressBar.alpha = 0;
progressBar.fillColor = [UIColor whiteColor];
progressBar.strokeColor = [UIColor whiteColor];
progressBar.position = CGPointMake(self.size.width / 2, self.size.height * 0.1);
progressBar.name = @"progressBar";
…
[self addChild:progressBar]
[progressBar runAction:[SKAction fadeAlphaTo:1 duration:1]];
}
// The notification has one KVP in its user info dictionary. This is "someKey."
// "someKey"'s float value is added to "progress."
-(void)rcvNotification:(NSNotification*)notification {
progress += [[notification.userData valueForKey:@"someKey"] floatValue];
// [self updateUI];
// note: if I call updateUI like that, self will have zero children regardless of whether or not it actually has more.
// a remedy:
[self runAction:[SKAction waitForDuration:0] completion:^{
[self updateUI];
}];
}
-(void)updateUI {
NSLog(@"count of children: %lu", self.children.count);
[progressBar runAction:[SKAction scaleXTo:progress duration:0.5] completion:
// code to run when finished animating change
// also logic for reaching 100% progress.
}];
}
我的困境是,在一个稳定的时刻,无法重新调整进度条。我发现self
暂时有0个孩子,所以我让它运行0秒动画。我想弄清楚为什么会发生这种奇怪的行为。