2009-07-14 3 views
6

Wenn ich eine Ansicht mit einem perform nach einer Verzögerung Brand:Wie kann man einen Selektor ausschalten, der nach einer Verzögerung (auf dem iPhone) ausgelöst wird?

[self performSelector:@selector(generateBall) withObject:NULL afterDelay:1.5]; 

... aber ich removeFromSuperview diese Ansicht vor den Wählern Feuer (zum Beispiel aufgrund von Benutzer-Interaktion), dann meiner app stürzt ab .

Gibt es eine Möglichkeit, den verzögerten Selektor in der Dealloc-Methode für diese Ansicht zu beenden?

EDIT:

Ich habe versucht beide:

[[NSRunLoop mainRunLoop] cancelPerformSelector:theBall target:self argument:nil]; 

und

[[NSRunLoop currentRunLoop] cancelPerformSelector:theBall target:self argument:nil]; 

und während beide arbeiten (so dass mir eine neue Ansicht laden), um die vorherige Ansicht Enden Laden up mir einen grauen Bildschirm geben.

Ich konnte keine anderen Tutorials oder andere Informationen über cancelPerformSelector als die Apple-Dokumente finden, die aufgelistet wurden, und die Dokumentation zu Threads und Runloops scheint sehr verworren zu sein (meistens weil sie nicht funktionieren Codebeispiele, die es mir erleichtern würden, durchzulaufen und zu verstehen, was vor sich ging.

Antwort

15

Weil ich perform bin mit: afterDelay, der einzige Weg, ich habe in der Lage gewesen, „zu töten“, um richtig alle zuvor angefordert, aber nicht gestartet Funktionalität verwendet :

Das folgende Codebeispiel zeigt, wie dies funktioniert (erstellen Sie eine neue Ansicht Vorlage XCode proj ect namens "select", und die selectViewController.h Datei mit diesem) ersetzen:

#import "selectViewController.h" 

@implementation selectViewController 

UILabel *lblNum; 
UIButton *btnStart, *btnStop; 
int x; 

- (void) incNum { 
    x++; 
    lblNum.text = [NSString stringWithFormat:@"%i", x]; 
    [self performSelector:@selector(incNum) withObject:NULL afterDelay:1.0]; 
} 

- (void) stopCounter { 
    [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(incNum) object:NULL]; 
} 

- (void)viewDidLoad { 
    x = 0; 

    lblNum = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 320, 460)]; 
    lblNum.textAlignment = UITextAlignmentCenter; 
    [self.view addSubview:lblNum]; 

    btnStart = [UIButton buttonWithType:UIButtonTypeRoundedRect]; 
    btnStart.frame = CGRectMake(40, 270, 240, 30); 
    [btnStart setTitle:@"start" forState:UIControlStateNormal]; 
    [btnStart addTarget:self action:@selector(incNum) forControlEvents:UIControlEventTouchUpInside]; 
    [self.view addSubview:btnStart]; 

    btnStop = [UIButton buttonWithType:UIButtonTypeRoundedRect]; 
    btnStop.frame = CGRectMake(40, 310, 240, 30); 
    [btnStop setTitle:@"stop" forState:UIControlStateNormal]; 
    [btnStop addTarget:self action:@selector(stopCounter) forControlEvents:UIControlEventTouchUpInside]; 
    [self.view addSubview:btnStop]; 

    [self performSelector:@selector(incNum) withObject:NULL afterDelay:1.0]; 
    [super viewDidLoad]; 
} 


- (void)didReceiveMemoryWarning { 
    [super didReceiveMemoryWarning]; 
} 

- (void)viewDidUnload { 
} 

- (void)dealloc { 
    [lblNum release]; 
    [super dealloc]; 
} 

@end 
3

Ich habe festgestellt, dass dies funktioniert super:

[NSObject cancelPreviousPerformRequestsWithTarget:self]; 
Verwandte Themen