1

使ってます

[self performSelector:@selector(someMethod) withObject:nil afterDelay:1];

時間遅延後にメソッドを何度も呼び出す。正常に動作していますが、問題は、次のクラスに移動しても、実行セレクターが前のクラスでバックグラウンドで実行されていることです。

なので、以下を使ってキャンセルしてみます

[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(someMethod) object:nil]; 

しかし、それは機能していません。私はでこれをしましたviewDidDisappear。実行セレクターをキャンセルする方法を教えてもらえますか?

これが私のコードです

-(void)textCalling
{


    NSString *str2=@"Something";
    UILabel *lbl =(UILabel*)[arrObj objectAtIndex:count2];
    [lbl setAlpha:0];
    lbl.numberOfLines=0;
    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDelegate:self];
    [UIView setAnimationDidStopSelector:@selector(animationDidStop:finished:context:)];
    lbl.text=str2;
    [UIView setAnimationDuration:0.0];
    [lbl setAlpha:0];
    [UIView commitAnimations];

}
-(void)animationDidStop:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context
{

    UILabel *lbl =(UILabel*)[arrObj objectAtIndex:count2];
    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:2.0];
    [lbl setAlpha:1];
    [UIView commitAnimations];
    count2++;
    if (count2<[arrCourse count]) {
        [self performSelector:@selector(textCalling) withObject:nil afterDelay:1];
    }else{
        count2=0;

        [self performSelector:@selector(imageCallingCourse) withObject:nil afterDelay:1];
    }
}
-(void)imageCallingCourse
{

    imgViewObj.image=[UIImage imageNamed:@"Objective.png"];
    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDelegate:self];
    [UIView setAnimationDidStopSelector:@selector(animationDidStopImageCourse:finished:context:)];
    [UIView setAnimationDuration:0.0];
    [imgViewObj setAlpha:0];
    [UIView commitAnimations];
}

-(void)animationDidStopImageCourse:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context
{
    NSLog(@"animationDidStopImage1");
    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:2.0];
    [imgViewObj setAlpha:1];
    [UIView commitAnimations];


}
4

4 に答える 4

2

「時間遅延後に何度もメソッドを呼び出す」方がよいでしょう。

timer = [NSTimer scheduledTimerWithTimeInterval:1
                                               target:self
                                             selector:@selector(someMethod)
                                             userInfo:nil repeats:YES];

そしてviewllDidDisappearで、[timer invalidate]それを停止するために使用します。

あなたの「somemethod」はこのように書きますか?

- (void)somemethod
{
//your code
[self performSelector:@selector(someMethod) withObject:nil afterDelay:1];
}

テストボタンを追加する必要があるかもしれません[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(someMethod) object:nil];。クリックすると呼び出されます。それが機能するかどうかを確認します。

あなたは問題を解決するようにコーディングすることができます。

- (void)somemethod { 
    if (needStop) {
        return; 
    } //your code [self performSelector:@selector(someMethod) withObject:nil 
afterDelay:1]; 
}

viewDidDisappearでneedStop=YESを設定します。

于 2013-01-09T06:20:06.840 に答える
0

.hでは、

BOOL checkMethodCall;

.m viewWillAppearでは、

checkMethodCall = NO;

viewWillDisappearで、

checkMethodCall = YES;

それから、

-(void)textCalling
{
  if(checkMethodCall)
  {
    return;
  }
  // Your code
}

したがって、ビューを変更した後、メソッドに戻った後のコードは実行されません。

于 2013-01-09T06:28:13.760 に答える
-1

これを試して..

[[自己クラス]cancelPreviousPerformRequestsWithTarget:自己セレクター:@selector(someMethod)オブジェクト:nil];

于 2013-01-09T07:02:39.173 に答える
-1

NSoperationを使用して操作を追加するだけで、実行する操作が複数ある場合はキャンセルして操作を開始し、それをnsoperationqueueに追加できます...

于 2013-01-09T06:57:28.373 に答える