Wie ein Wähler zu töten, die nach einer Verzögerung schießen (auf dem iPhone) festgelegt ist?

StackOverflow https://stackoverflow.com/questions/1123274

  •  13-09-2019
  •  | 
  •  

Frage

Wenn ich eine Ansicht mit einem perform Satz nach einer Verzögerung Feuer:

[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, die verzögerte Wähler in der dealloc Methode für diese Ansicht?

zu töten

EDIT:

Ich habe beide versucht:

[[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), endet die vorherige Ansicht geladen, um mir einen grauen Bildschirm.

Ich habe nicht in der Lage gewesen, all Tutorials oder andere Informationen über cancelPerformSelector andere als die Apple-docs zu finden, die aufgeführt wurden, und die Dokumentation zu Fäden und führen Schleifen scheinen sehr verworren zu sein (vor allem, weil sie nicht Liste funktionierenden Code Proben, die es einfacher für mich machen würde durch und verstehen Schritt, was los war).

War es hilfreich?

Lösung

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

[NSObject cancelPreviousPerformRequestsWithTarget:self selector:theBall object:nil];

Das folgende Codebeispiel zeigt, wie das funktioniert (erstellen Sie eine neue Ansicht Vorlage XCode Projekt „wählen“, und ersetzen Sie die selectViewController.h Datei mit diesem):

#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

Andere Tipps

Ich habe festgestellt, dass dies funktioniert gut:

[NSObject cancelPreviousPerformRequestsWithTarget:self];
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top