как я могу передать событие через @selector в NSTimer - PullRequest
0 голосов
/ 13 июля 2011

// Мне нужно отправить событие через @selector ([move: event]) заранее спасибо.

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    moveTimer = [NSTimer scheduledTimerWithTimeInterval:0.05 target:self selector:@selector(move:) userInfo:nil repeats:YES];
}

// моя функция перемещения

- (void)move:(UIEvent *)event { 
    UITouch *touch = [[event allTouches] anyObject];
    CGPoint location = [touch locationInView:touch.view];
    if (location.x > myImageView.center.x){
        [UIView animateWithDuration:0.001 animations:^{
            myImageView.center = CGPointMake(myImageView.center.x+5, myImageView.center.y); 
        }];
    }
    else if (location.x < myImageView.center.x){
        [UIView animateWithDuration:0.001 animations:^{
            myImageView.center = CGPointMake(myImageView.center.x-5, myImageView.center.y); 
        }];
    }
    if (location.y < myImageView.center.y){
         [UIView animateWithDuration:0.001 animations:^{
            myImageView.center = CGPointMake(myImageView.center.x, myImageView.center.y-5); 
        }];
    }
    else if (location.y > myImageView.center.y){
        [UIView animateWithDuration:0.001 animations:^{
            myImageView.center = CGPointMake(myImageView.center.x, myImageView.center.y+5); 
        }];
    }
}

Ответы [ 2 ]

3 голосов
/ 13 июля 2011

Вы не можете передавать данные через селектор.Селектор - это просто имя метода, а не его вызов.При использовании с таймером передаваемый селектор должен принимать один аргумент, и этот аргумент будет таймером, который его вызвал.Однако вы можете передать данные в вызываемый метод с помощью параметра userInfo.Вы передаете событие в этом параметре и извлекаете его, используя метод userInfo для таймера.

moveTimer = [NSTimer scheduledTimerWithTimeInterval:0.05 target:self
                                           selector:@selector(move:)
                                           userInfo:event repeats:YES];

- (void)move:(NSTimer *)theTimer {
    UIEvent *event = [theTimer userInfo];
    ...
0 голосов
/ 13 июля 2011

Если вы хотите использовать таймер для запуска метода, который принимает параметры, используйте -scheduledTimerWithTimeInterval:invocation:repeats: с соответствующим экземпляром NSInvocation вместо одного из методов, которые принимают селекторы.

Тем не менее, вы 'придется пересмотреть ваш подход.Отдельные объекты UIEvent и UITouch имеют время жизни не менее целой последовательности касаний.Согласно документации для каждого из этих классов, вы не должны сохранять их или иным образом использовать их вне метода, в котором вы их получили.Если вам необходимо сохранить информацию из любого из этих объектов для последующего использования, вам следует скопировать необходимую информацию в свое собственное хранилище.

...