NSInvalidArgumentException, когда я пытаюсь вызвать внешний метод из другого метода - PullRequest
0 голосов
/ 06 октября 2011

Я получаю консольные сообщения:

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]];
}

Метод завершения касаний находится в файле класса, отличном от файла перевода.

Метод translate находится в файле класса DefaultObject, который является подклассом CCSprite

pc синтезирован, а @property неатомный, сохраните

Чего мне не хватает?

1 Ответ

1 голос
/ 07 октября 2011

Вам не хватает метки аргумента, как в определении метода, так и в вызове метода.

Прежде всего, я вижу, откуда вы: в большинстве языков программирования, включая, помимо прочего, 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];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...