//我需要通过@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);
}];
}
}
答案 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对象的生命周期至少与整个触摸序列一样长。根据每个类的文档,您不应保留它们或以其他方式在接收它们的方法之外使用它们。如果您需要保存这些对象中的信息以供以后使用,您应该将所需信息复制到您自己的存储中。