使用childNodeWithName时调用实例方法

时间:2015-08-18 15:28:29

标签: ios objective-c sprite-kit

是否可以在不使用实例变量或@property?

的情况下调用实例方法

以下是我创建类实例的方法。在该方法中,我尝试调用类的实例移动方法来强制实例移动:

-(void)createCharacterNPC
{
    int randomness = [self getRandomNumberBetweenMin:1 andMax:20];

    for (int i = 0; i < randomness; i += 1)
    {
        NSString *npcName = [NSString stringWithFormat:@"anNPC%i", randomness];

        NPCclass *NPC = [[NPCclass alloc] initWithName:npcName];
        NPC.position = CGPointMake(self.size.width/2, self.size.height/2);
        NPC.zPosition = 1.0;
        [_worldNode addChild:NPC];

        // THIS OBVIOUSLY WORKS. But I can't use this technique outside this method.
        [NPC beginMovement];

        // THIS IS WHAT I WANT, BUT XCODE DOESN'T ALLOW ME TO WRITE CODE THIS WAY.        
        [[_worldNode childNodeWithName:@"anNPC1"] beginMovement];
    }
}

有没有办法允许[[_worldNode childNodeWithName:@&#34; anNPC1&#34;] beginMovement];上班?或者某种类似的方式,所以我不必创建一个NPC的实例变量(如此:_NPC)?

我问,因为所有这一切都发生在迷你游戏场景中,NPCclass将被随机数量初始化(使用arc4random()方法)。 NPCclass使用向量(平台化器中的物理)运动自行移动,但我需要在创建后立即初始化其移动方法,然后我需要在场景的其他方法中使用其名称定期访问每个单独创建的NPCclass实例。由于我不知道每次玩迷你游戏时会创建多少个NPCclass实例,我不能使用IVAR或类似@property NPCclass * anNPC;

请帮忙。

2 个答案:

答案 0 :(得分:1)

Xcode抱怨

 [[_worldNode childNodeWithName:@"anNPC1"] beginMovement];

因为方法-childNodeWithName返回SKNode对象。 SKNode类的实例不响应选择器-beginMovement(或者当Xcode放置它时,没有可见的@interface声明选择器-beginMovement)。 Xcode向您展示了这一点,迫使您确保编写了想要编写的内容。由于您确定,您可以告诉Xcode返回的对象属于NPCclass类型。

(NPCclass *)[_worldNode childNodeWithName:@"anNPC1"]

现在您可以展开语句以调用-beginMovement

[(NPCclass *)[_worldNode childNodeWithName:@"anNPC1"] beginMovement];

注意

您可能会混淆一些概念。 NPCclass是一个班级。 +nodeSKNode方法,您可以使用[NPCclass node];进行调用。 -beginMovement是一个实例方法,使用:

调用
NPCclass *npc = [NPCclass node];
[npc beginMovement];

或者:

[(NPCclass *)anyObject beginMovement]; 
// make sure anyObject responds to this selector though, or you app will crash.

类方法以+为前缀,实例方法为-

答案 1 :(得分:0)

类方法不使用实例,只使用类名。

作为一个例子考虑

NSString` class method: `+ (id nullable)stringWithContentsOfFile:(NSString * nonnull)path

和用法:

NSString *fileData = [NSString stringWithContentsOfFile:filePath];