2011-07-13 16 views
0

//イベントトラフ@selector([移動:イベント])を に送信する必要があります。NSTimerで@selector経由でイベントを渡す方法

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

答えて

3

あなたは、セレクタを介してデータを渡すことはできません。セレクタはメソッドの名前であり、メソッドの呼び出しではありません。タイマーとともに使用する場合、渡すセレクターは1つの引き数を受け入れ、その引き数はそれを引き起こしたタイマーになります。ただし、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

ありがとうございます!小さなバグが発生しました。 コード移動機能 を参照してください。画面にタッチすると、タッチした位置に画像が移動します。 少し時間がかかり、画像は左隅(0,0)に移動します。 理由が分かりますか?とにかくお返事ありがとう – majorl3oat

0

、セレクタを取る方法の一つの代わりにNSInvocationの適切なインスタンスで-scheduledTimerWithTimeInterval:invocation:repeats:を使用しています。

あなたはあなたのアプローチを再考しなければならないと言いました。個々のUIEventオブジェクトとUITouchオブジェクトの寿命は、少なくともタッチシーケンス全体の長さと同じです。それらのクラスのドキュメントごとに、それらを保持したり、それらを受け取ったメソッドの外で使用したりしないでください。後で使用するためにこれらのオブジェクトのいずれかから情報を保存する必要がある場合は、必要な情報を自分のストレージにコピーする必要があります。

+0

ありがとうございます。私はインターネット上でNSInvocationに関するコードを見つけましたが、どのように使用するか分かりません。 paramをどうやって渡すことができるか説明してください。 – majorl3oat

+0

[Appleの使用方法の説明](http://tinyurl.com/6ex9363)をお読みになりましたか? – Caleb

関連する問題