为什么我不能向这个数组添加对象?

时间:2015-03-29 12:44:01

标签: ios objective-c sprite-kit

出于某种原因,当我制作NSMutableArray时,它不会添加SKLabelNodes。我在我的代码中添加它们,但是当我要求计数时它给了我0.我做错了什么?或者是应该工作不起作用的东西?老实说,我不知道

self.titleLabels = [[SKNode alloc]init];
self.titleLabels.position = CGPointMake(CGRectGetMidX(self.frame),  700);

self.titleLabelsArray = [[NSMutableArray alloc]initWithCapacity:5];

SKLabelNode *label1 = [SKLabelNode labelNodeWithFontNamed:@"Code-Pro-Demo"];
label1.text = @"0";
label1.fontSize = 90;
label1.fontColor = [SKColor colorWithRed:90/255.0f green:197/255.0f blue:198/255.0f alpha:1];
label1.position = CGPointMake(-150, 100);
label1.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:label1.frame.size];
label1.physicsBody.dynamic = NO;

SKLabelNode *label2 = [SKLabelNode labelNodeWithFontNamed:@"Code-Pro-Demo"];
label2.text = @"1";
label2.fontSize = 90;
label2.fontColor = [SKColor colorWithRed:1 green:1 blue:1 alpha:1];
label2.position = CGPointMake(-30, 100);
label2.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:label2.frame.size];
label2.physicsBody.dynamic = NO;

SKLabelNode *label3 = [SKLabelNode labelNodeWithFontNamed:@"Code-Pro-Demo"];
label3.text = @"2";
label3.fontSize = 90;
label3.fontColor = [SKColor colorWithRed:1 green:1 blue:1 alpha:1];
label3.position = CGPointMake(150, 100);
label3.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:label3.frame.size];
label3.physicsBody.dynamic = NO;

SKLabelNode *label4 = [SKLabelNode labelNodeWithFontNamed:@"Code-Pro-Demo"];
label4.text = @"3";
label4.fontSize = 90;
label4.fontColor = [SKColor colorWithRed:1 green:1 blue:1 alpha:1];
label4.position = CGPointMake(-150, 0);
label4.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:label4.frame.size];
label4.physicsBody.dynamic = NO;

SKLabelNode *label5 = [SKLabelNode labelNodeWithFontNamed:@"Code-Pro-Demo"];
label5.text = @"4";
label5.fontSize = 120;
label5.fontColor = [SKColor colorWithRed:228/255.0f green:70/255.0f blue:38/255.0f alpha:1];
label5.position = CGPointMake(10, -1);
label5.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:label5.frame.size];
label5.physicsBody.dynamic = NO;


[self.titleLabels addChild:label1];
[self.titleLabels addChild:label2];
[self.titleLabels addChild:label3];
[self.titleLabels addChild:label4];
[self.titleLabels addChild:label5];

[self addChild:self.titleLabels];

[self.titleLabelsArray addObject:label1];
[self.titleLabelsArray addObject:label2];
[self.titleLabelsArray addObject:label3];
[self.titleLabelsArray addObject:label4];
[self.titleLabelsArray addObject:label5];
NSLog(@"%i",self.titleLabelsArray.count);

2 个答案:

答案 0 :(得分:0)

正如您在自己的回答中所指出的,在这种情况下,不需要将5个SKLabelNode添加到不同的数组中,实际上您可以使用self.titleLabels.children迭代它们。

但是我试图理解为什么你的原始代码没有按预期工作,事实上你的最后一行代码确实应该打印数字5.

第1步

编译器不喜欢这一行

NSLog(@"%i",self.titleLabelsArray.count);

因为NSUInteger类型的值不应该用作格式参数。请改用:

NSLog(@"%lu",(unsigned long)self.titleLabelsArray.count);

第2步

代码确实正常工作(并打印5)如果属性titleLabelsArray未声明为弱。 例如。这是一个正确的声明:

@property NSMutableArray * titleLabelsArray;

这是输出:

2015-03-29 16:09:31.919 MyProject[1231:695366] 5

另一方面,对于这种情况,这是一个错误的声明:

@property (weak) NSMutableArray * titleLabelsArray;

现在你得到了这个输出:

2015-03-29 16:10:59.713 MyProject[1275:699690] 0

所以我的问题是:你如何声明属性titleLabelsArray?

第3步

最后,我建议您在不需要将变量公开时使用实例变量而不是属性。

您可以这样声明

@implementation YourSuperCoolClass
{
    NSMutableArray * titleLabelsArray;
}

然后您在没有 self。前缀

的情况下访问它
[titleLabelsArray addObject:label1];
[titleLabelsArray addObject:label2];
[titleLabelsArray addObject:label3];
[titleLabelsArray addObject:label4];
[titleLabelsArray addObject:label5];

NSLog(@"%lu",(unsigned long)titleLabelsArray.count);

答案 1 :(得分:-1)

使用此:

self.titleLabels.children

这是一个用于子节点的内置数组