كيفية قتل محدد تم ضبطه على النار بعد تأخير (على iPhone)؟

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

  •  13-09-2019
  •  | 
  •  

سؤال

إذا كان لدي رأي مع مجموعة أداء لإطلاق النار بعد تأخير:

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

... لكنني أعطيت المشترحة التي عرضها قبل حرائق المحدد (على سبيل المثال، بسبب تفاعل المستخدم)، ثم تعطل تطبيقي.

هل هناك طريقة لقتل محدد التأخير في طريقة Deallec لهذا الرأي؟

تعديل:

لقد جربت كليهما:

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

و

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

وبينما يعمل كلاهما (يتيح لي تحميل طريقة عرض جديدة)، فإن تحميل الرأي السابق ينتهي بإعطائي شاشة رمادية.

لم أتمكن من العثور على أي برامج تعليمية أو غيرها من المعلومات حول CluchperPormBelector بخلاف تلك المستندات Apple التي تم إدراجها، ويبدو أن الوثائق الموجودة على المواضيع وحلقات تشغيل شديدة التوافق (معظمها لأنهم لا يذكرون عينات رمز العمل، والتي سيجعل من الأسهل بالنسبة لي أن أتقدم وفهم ما كان يحدث).

هل كانت مفيدة؟

المحلول

لأنني أستخدم industrenstrector: AfterDelay، الطريقة الوحيدة التي تمكنت من "قتل" بشكل صحيح أي وظيفة غير مسبوقة ولكن لا يتم تشغيلها تستخدم:

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

يعرض نموذج التعليمات البرمجية التالي كيفية عمل هذا (إنشاء مشروع Xcode Xcode جديد يسمى "SELECT"، واستبدال ملف SelectViewController.h مع هذا):

#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

نصائح أخرى

لقد وجدت أن هذا يعمل بشكل رائع:

[NSObject cancelPreviousPerformRequestsWithTarget:self];
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top