【问题标题】:SKLabelNode when added to class throws attempted to add nil node errorSKLabelNode 添加到类时抛出试图添加 nil 节点错误
【发布时间】: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 方法。

标签: ios sprite-kit sklabelnode


【解决方案1】:

要么删除弱关键字:

@property (nonatomic) SKLabelNode* timerLevel;

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2012-06-27
      • 1970-01-01
      • 1970-01-01
      • 2012-09-22
      • 1970-01-01
      • 1970-01-01
      • 2015-06-10
      • 1970-01-01
      相关资源
      最近更新 更多