0

なぜこれが機能しないのか理解できません。タイマーサイクルがヒットしたときに lblstatus を表示しようとしています:

-(void) viewDidAppear:(BOOL)animated
{
        [NSTimer scheduledTimerWithTimeInterval:1
                                         target:self
                                       selector:@selector(TimeForPictureCycle)
                                       userInfo:nil
                                        repeats:NO];
}

-(void)TimeForPictureCycle
{
    while(YES)
    {
        [lblStatus setHidden:NO];
        sleep(2);
        [lblStatus setHidden:YES];
        sleep(3);
    }
}
4

2 に答える 2

3

メイン スレッドでの呼び出しsleep()、つまり、ラベルをhiddenそのスレッドに設定した後は一時停止し、実行ループが続行されなくなり、UI を更新できなくなります。現在のコードは単純にアプリケーション全体をブロックします。

あなたができることはこれです:

-(void) viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    self.showTimer = [NSTimer scheduledTimerWithTimeInterval:1
                                         target:self
                                       selector:@selector(showLabel)
                                       userInfo:nil
                                        repeats:NO];
}

-(void)showLabel
{ 
    [lblStatus setHidden:NO];
    self.hideTimer = [NSTimer scheduledTimerWithTimeInterval:2
                                         target:self
                                       selector:@selector(hideLabel)
                                       userInfo:nil
                                        repeats:NO];
}

-(void)hideLabel
{        
    [lblStatus setHidden:YES];
    self.showTimer = [NSTimer scheduledTimerWithTimeInterval:3
                                         target:self
                                       selector:@selector(showLabel)
                                       userInfo:nil
                                        repeats:NO];
}


- (void)viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:animated];
    [self.showTimer invalidate];
    [self.hideTimer invalidate];
}
于 2012-11-04T22:51:33.787 に答える
1

次の方法で簡単に実行できます。

-(void)viewDidAppear:(BOOL)animated {
    [lblStatus performSelector:@selector(setHidden:) withObject:0 afterDelay:1];
    [lblStatus performSelector:@selector(setHidden:) withObject:@1 afterDelay:3];
}

オブジェクトとして 0 を渡すことができる理由はよくわかりませんが、機能します。

于 2012-11-04T23:57:53.020 に答える