如何在NSTimer中通过@selector传递事件

时间:2011-07-13 02:59:48

标签: xcode events selector nstimer touches

//我需要通过@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 个答案:

答案 0 :(得分:3)

您无法通过选择器传递数据。选择器只是方法的名称,而不是对它的调用。当与计时器一起使用时,您传递的选择器应该接受一个参数,该参数将是导致它的计时器。但是,您可以使用userInfo参数将数据传递给被调用的方法。您在该参数中传递事件,并使用计时器上的userInfo方法检索它。

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

- (void)move:(NSTimer *)theTimer {
    UIEvent *event = [theTimer userInfo];
    ...

答案 1 :(得分:0)

如果要使用计时器来触发带参数的方法,请使用-scheduledTimerWithTimeInterval:invocation:repeats:和适当的NSInvocation实例代替采用选择器的方法之一。

那就是说,你将不得不重新考虑你的方法。单个UIEvent和UITouch对象的生命周期至少与整个触摸序列一样长。根据每个类的文档,您不应保留它们或以其他方式在接收它们的方法之外使用它们。如果您需要保存这些对象中的信息以供以后使用,您应该将所需信息复制到您自己的存储中。