我正在关注这个Spritekit教程http://code.tutsplus.com/tutorials/ios-sdk-build-a-facts-game-interface-creation--mobile-20764
他们建议在viewDidLoad方法中添加计时器的文本。本教程中给出的代码如下所示:
_timerLevel = [SKLabelNode labelNodeWithFontNamed:@"Chalkduster"];
_timerLevel.text = @"30";
_timerLevel.fontSize = 70;
_timerLevel.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame)+350);
[self addChild:_timerLevel];
一旦我运行[self addChild:_timerLevel]行,就会抛出“试图向父级添加nile节点错误”的错误。
_timerLevel在接口中声明为
@property (nonatomic,weak) SKLabelNode* timerLevel;
这样的场景如下:
-(id) initWithSize:(CGSize)size inLevel:(NSInteger)level withPlayerLives:(int)lives {
if (self = [super initWithSize:size]) {
self.backgroundColor = [SKColor colorWithRed:0.35 green:0.25 blue:0.5 alpha:1.0];
defaults = [NSUserDefaults standardUserDefaults];
playerLives = lives;
playerLevel = level;
maximumTime = 30;
}
return self;
}
错误是否告诉我_timerLevel尚未初始化,因此为零?如何正确初始化?非常感谢
答案 0 :(得分:2)
删除弱关键字:
@property (nonatomic) SKLabelNode* timerLevel;
或者首先将标签分配给局部变量:
SKLabelNode* timerLevel = [SKLabelNode labelNodeWithFontNamed:@"Chalkduster"];
_timerLevel = timerLevel;
这里使用weak的问题在于,在初始化标签之后,除非您将其分配给局部变量或删除weak关键字,否则没有强引用。否则,标签将被初始化,返回,并在下一行执行之前立即解除分配并设置为nil。
答案 1 :(得分:0)
您不希望视图控制器的ViewDidLoad函数中包含SKLabelNode代码。您想在您创建的SKScene的didMoveToView函数中移动它。