0

2 つのアラート ビューをメイン スレッドに送信しようとしていますが、最初のアラート ビューが閉じられておらず、2 番目のアラート ビューが表示されると、アプリケーションがクラッシュします。どうすればこれを回避できますか?

- (void)viewDidLoad
{
    [super viewDidLoad];
    gregorianCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
        self.date1 = [NSDate dateWithTimeInterval:[testTask timeInterval] sinceDate:[NSDate date]];

        timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(timerAction:) userInfo:nil repeats:YES];
        [timer fire];
}
-(void)timerAction:(NSTimer *)t{
     NSDate *now = [NSDate date];
    NSDateComponents *components = [gregorianCalendar components:NSHourCalendarUnit|NSMinuteCalendarUnit|NSSecondCalendarUnit  fromDate:now toDate:self.date1 options:0];

    NSString *timeRemaining = nil;
    if([now compare:self.date1] == NSOrderedAscending){
        timeRemaining = [NSString stringWithFormat:@"%02d:%02d:%02d", [components hour], [components minute], [components second]];
        NSLog(@"works %@", timeRemaining);
    } else {
        timeRemaining = [NSString stringWithFormat:@"00:00:00"];
        [self.timer invalidate];
        self.timer = nil;
        UIAlertView *alertView = [[UIAlertView alloc]initWithTitle:[testTask taskName] message:@"Time is up!" delegate:self cancelButtonTitle:@"Ok" otherButtonTitles:nil, nil];
        [alertView performSelectorOnMainThread:@selector(show) withObject:nil waitUntilDone:YES];       
        NSLog(@"ended");
    }
   timerLabel.text = timeRemaining;
    [timerLabel setNeedsDisplay];
    [self.view setNeedsDisplay];
}
4

1 に答える 1

0

alertView を ivar または " @property" として宣言します。既に存在する場合は、次のアラートを表示しません。

または、最初のアラートを無視して、次のアラートを表示します。

たとえば、アラートを表示する場合:

if(self.alertView == NULL)
{
    self.alertView = [[UIAlertView alloc]initWithTitle:[testTask taskName] message:@"Time is up!" delegate:self cancelButtonTitle:@"Ok" otherButtonTitles:nil, nil];
    [alertView performSelectorOnMainThread:@selector(show) withObject:nil waitUntilDone:YES];       
    NSLog(@"ended");
}

閉じるときは、delegate メソッドを使用します。

- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex
{
    // setting this to NULL means that another alert can be displayed
    self.alertView = NULL;
}
于 2013-07-06T06:37:14.677 に答える