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 节点错误的主要内容,如果未能解决你的问题,请参考以下文章
List.addAll 在尝试添加另一个列表时抛出 UnsupportedOperationException [重复]
Android布局预览器在添加自定义LinearLayout时抛出错误