SKLabelNode 添加到类时抛出试图添加 nil 节点错误

Posted

技术标签:

【中文标题】SKLabelNode 添加到类时抛出试图添加 nil 节点错误【英文标题】:SKLabelNode when added to class throws attempted to add nil node error 【发布时间】:2014-12-11 00:03:03 【问题描述】:

我正在关注这个 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] 行,就会抛出错误“尝试将尼罗河节点错误添加到父级”。

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

【问题讨论】:

在 didMoveToView 中添加你的 _timerLevel 而不是 viewDidLoad 方法。 【参考方案1】:

要么删除弱关键字:

@property (nonatomic) SKLabelNode* timerLevel;

或者先将标签赋给一个局部变量:

SKLabelNode* timerLevel = [SKLabelNode labelNodeWithFontNamed:@"Chalkduster"];
_timerLevel = timerLevel;

这里使用weak 的问题是,在初始化标签后,没有强引用对其进行保持,除非您将其分配给局部变量或删除weak 关键字。否则,标签会被初始化、返回,并在下一行执行之前立即解除分配并设置为 nil。

【讨论】:

【参考方案2】:

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

【讨论】:

以上是关于SKLabelNode 添加到类时抛出试图添加 nil 节点错误的主要内容,如果未能解决你的问题,请参考以下文章

Spark Shell 导入正常,但在引用类时抛出错误

List.addAll 在尝试添加另一个列表时抛出 UnsupportedOperationException [重复]

VS2015 在添加新的实体数据模型时抛出异常

Android布局预览器在添加自定义LinearLayout时抛出错误

Peewee 在尝试添加用户定义的运算符时抛出 KeyError

UI 元素添加到控件集合时抛出异常