【问题标题】:SpriteKit Label Node not appearingSpriteKit标签节点未出现
【发布时间】:2026-02-17 12:35:01
【问题描述】:

我有一个奇怪的问题。 我在我的一个项目中使用标签节点。上次我添加自定义字体时,我的标签节点无法正常工作。 如果我为我的标签设置了字体(例如在此文本下的示例),标签就不会出现在屏幕上,但应用程序可以正常工作。单击按钮开始游戏时,加载游戏视图也需要一段时间(我猜字体正在加载?):

  label1 = [SKLabelNode labelNodeWithFontNamed:@"Arial"];

但是如果我没有为我的标签设置任何字体,应用程序就会崩溃并且我会收到警告:

 *** Terminating app due to uncaught exception 'Attemped to add nil node', reason: 'Attemped to add nil node to parent: <SKScene> name:'(null)' frame:{{0, 0}, {568, 320}}'

我在这里阅读了很多关于字体问题的帖子。但我就是找不到类似的东西。

出现错误的代码(调用函数到秒表节点查看):

-(void)addStopwatch
{

    stopwatch.position = CGPointMake(self.frame.size.width/16,self.frame.size.height);
    stopwatch = [SKLabelNode labelNodeWithFontNamed:@"Arial"];
    stopwatch.fontSize = 25;
    stopwatch.fontColor = [UIColor whiteColor];
    stopwatch.text = [NSString stringWithFormat:@"%s","00:00"];
    stopwatch.name = @"stopW";
    [self addChild:stopwatch];

 }

秒表精灵在 .h 文件中声明:

SKLabelNode* stopwatch;

【问题讨论】:

  • 如果删除自定义字体并清理构建文件夹(xcode: project -> clean),错误会消失吗?哪些标签是 nil,带有自定义字体的标签或所有其他标签或只是任何标签?您是否在新的 SK 项目中尝试过自定义字体是否正常工作?即使新项目失败,字体也可能是问题所在。否则,您需要更精确地调试它(断点,yada-yada)。
  • @LearnCocos2D 我尝试过 Xcode 包含的 put 字体。而且没有一个标签出现。我还尝试创建一个新的 SK 标签,并且在我运行游戏时它也是不可见的。我试图删除自定义字体并清理项目,但没有运气..
  • 你能发布错误发生的代码(整个方法或足够的上下文)吗?看不到就加异常断点(Xcode显示main.m)
  • @LearnCocos2D 已编辑。当我调用一个函数来添加秒表(标签节点)来查看时出现问题。
  • 我已经解决了删除添加 sk 标签节点的旧方法以及从全局初始化中删除我的标签注释并用其他名称重新创建它的问题.. 仍然不知道发生了什么。我认为实现自定义字体是个问题。

标签: ios sprite-kit sklabelnode


【解决方案1】:
stopwatch.position = CGPointMake(self.frame.size.width/16,self.frame.size.height);
stopwatch = [SKLabelNode labelNodeWithFontNamed:@"Arial"];

标签位于位置 0,0。创建标签会创建一个具有默认属性的新标签。设置了位置的旧的(如果曾经存在的话)被丢弃。

试试这个方法:

stopwatch = [SKLabelNode labelNodeWithFontNamed:@"Arial"];
stopwatch.position = CGPointMake(self.frame.size.width/16,self.frame.size.height);

这也是多余的:

stopwatch.text = [NSString stringWithFormat:@"%s","00:00"];

同写:

stopwatch.text = @"00:00";

【讨论】:

  • 试过..同样的问题..我不明白。在我尝试使用自定义字体之前,我的标签节点没有定义要使用的字体,并且它适用于某些默认字体。现在,如果我删除要写入标签的字体行,我的应用程序就会崩溃。
【解决方案2】:

试试这个...

-(void)addStopwatch
{
    SKLabelNode *stopwatch = [SKLabelNode labelNodeWithFontNamed:@"Arial"];
    // This positions the label node in the scene
    stopwatch.position = CGPointMake(self.frame.size.width/2,self.frame.size.height/2);
    stopwatch.fontSize = 25;
    stopwatch.fontColor = [UIColor whiteColor];
    stopwatch.text = [NSString stringWithFormat:@"%s","00:00"];
    stopwatch.name = @"stopW";
    [self addChild:stopwatch];
}

编辑:问题不在于变量是全局变量。标签不可见,因为它不在场景中 (y = self.frame.size.height)。您可以通过

从代码的其他部分按名称访问标签
SKLabelNode *label = (SKLabelNode *)[self childNodeWithName:@"stopW"];
label.text = ...

【讨论】:

  • 它有效。但是如果我想将秒表节点声明为全局的,这样我就可以改变它的值和其他东西,它不会起作用吗?