2011-10-06 19 views
0

我得到的控制台消息内调用外部方法:NSInvalidArgumentException当我试图从另一个方法

2011-10-05 17:21:15.112 Fairstead[4986:207] -[CCSprite translate::::]: unrecognized selector sent to instance 0x546fdb0 
2011-10-05 17:21:15.116 Fairstead[4986:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[CCSprite translate::::]: unrecognized selector sent to instance 0x546fdb0' 



    -(void)ccTouchEnded:(UITouch *)touch withEvent:(UIEvent *)event 
    { 
     CGPoint touchLocation = [touch locationInView: [touch view]]; 
     touchLocation = [[CCDirector sharedDirector]convertToGL:touchLocation]; 
     touchLocation = [self convertToNodeSpace:touchLocation]; 

     [pc translate:300.0 :touchLocation :pc.position :pc]; //crash on this line 

    } 

这里是翻译方法:

-(void) translate:(float) objectVelocity: (CGPoint) translateLocation: (CGPoint) objectLocation:(DefaultObject *) sender 
{ 
    CGPoint moveDifference = ccpSub(translateLocation, objectLocation); 
    float distanceToMove = ccpLength(moveDifference); 
    float moveDuration = distanceToMove/objectVelocity; 

    [sender runAction:[CCMoveTo actionWithDuration:moveDuration position:translateLocation]]; 
} 

的触摸结束的方法是不同的类文件比翻译。

的翻译方法是在DefaultObject类文件,它是一个子类CCSprite的

电脑合成和@property是非原子,保留

我缺少什么?

回答

1

您在方法定义和方法调用中缺少参数标签。

首先,我可以看到你是从哪里来的:在大多数编程语言,包括但不限于C,C++,JAVA等的方法有以下形式:

float acceleration(float speed, float angle) { } 

的Objective-C,然而,不同的是,因为你还需要标注的参数:

- (float) accelerationFromSpeed:(float)speed andAngle:(float)angle { } 

现在,objC初学者可能会问,为什么我们需要标注的参数时,我们已经为它们命名?考虑下面的C++调用我们上面的第一种方法:

float result = obj->acceleration(23, 45); 

现在让我问你,什么是23和45指什么?您必须回到方法定义才能知道,例如,23是速度,45是角度。有些程序员甚至可能做到以下几点:

float speed = 23; 
float angle = 45; 
float result = obj->acceleration(speed, angle); 

尽管如此,为什么我们需要声明变量时,我们可以做到在Objective-C如下:

float result = [obj accelerationFromSpeed:23 andAngle:45]; 

现在,您可以轻松地知道什么23 45表示只是从方法调用本身。不需要返回或记忆方法定义头或声明变量。

回到你的代码,你需要修改你的方法定义头一样的东西:

-(void) translate:(CGPoint)translateLocation 
    withVelocity:(float)objectVelocity 
andObjectLocation:(CGPoint)objectLocation 
     andSender:(DefaultObject *)sender 
{ 
    CGPoint moveDifference = ccpSub(translateLocation, objectLocation); 
    float distanceToMove = ccpLength(moveDifference); 
    float moveDuration = distanceToMove/objectVelocity; 

    [sender runAction:[CCMoveTo actionWithDuration:moveDuration position:translateLocation]]; 
} 

而且使用调用它(国产这里多行的清晰度,但你可以随时坍塌成一条线,如果你更喜欢):

[pc  
     translate:touchLocation 
     withVelocity:300.0 
andObjectLocation:pc.position 
     andSender:pc];