SKLabelNode在添加到类抛出时试图添加nil node错误



我正在按照这个Spritekit教程 http://code.tutsplus.com/tutorials/ios-sdk-build-a-facts-game-interface-creation--mobile-20764

他们建议在viewDidLoad Method中添加计时器的文本。 本教程中给出的代码如下所示:

_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尚未初始化,因此为零? 如何正确初始化它? 非常感谢

删除弱关键字:

@property (nonatomic) SKLabelNode* timerLevel;

或者先将标签分配给局部变量:

SKLabelNode* timerLevel = [SKLabelNode labelNodeWithFontNamed:@"Chalkduster"];
_timerLevel = timerLevel;
这里使用 weak 的问题在于,在

初始化标签后,除非你将其分配给局部变量或删除 weak 关键字,否则没有强引用保留它。否则,标签将被初始化、返回,并立即解除分配并设置为 nil,甚至在下一行执行之前。

您不希望 SKLabelNode 代码出现在视图控制器的 ViewDidLoad 函数中。 你想在你创建的SKScene的didMoveToView函数中移动它。

最新更新