2012-05-08 17 views
2

我在解決一個問題時遇到了一些麻煩,需要一次更新兩次UILabel。基本上用戶點擊播放按鈕來聽到聲音。當聲音播放時,「消息1」出現在UILabel中。當聲音播放完畢後,「Message 2」出現在同一個標​​籤中。當我運行這個標籤時,會直接轉到「消息2」。以同樣的方法更新UILabel兩次

.H

@interface ViewController : UIViewController 
<AVAudioRecorderDelegate, AVAudioPlayerDelegate> 
{ 
AVAudioPlayer *audioPlayer; 
UIButton *playButton; 
UILabel *answerLabel; 

} 
@property (nonatomic, retain) IBOutlet UIButton *playButton; 
@property (nonatomic, retain) IBOutlet UILabel *answerLabel; 
-(IBAction) play; 
@end 

的.m

-(IBAction) play 
{  
     int length = [audioPlayer duration]; 
     [audioPlayer play]; 
     answerLabel.text = @"Message 1"; 
     [NSThread sleepForTimeInterval:length]; 
     answerLabel.text = @"Message 2"; 
} 

回答

5

我看你實現AVAudioPlayerDelegate協議,所以我認爲在某些時候你設置播放機以self

委託。如果是這樣的話您的播放方法更改爲以下:

-(IBAction) play 
{  
    [audioPlayer play]; 
    answerLabel.text = @"Message 1"; 
} 

然後實現此方法:

- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag 
{ 
    answerLabel.text = @"Message 2"; 
} 
+0

這個工程,我想我的頭腦變得空白,忽略了audioPlayerDidFinishPlaying部分,不需要[NSThread sleepForTimeInterval:length]部分。 – SNV7

2

只有一次UI線程被解除阻塞,當它睡覺它仍然受阻,因此永遠不會出現的第一個標籤到UI更新發生。

你可以做的是:

answerLabel.text = @"Message 1"; 
[answerLabel performSelector:@selector(setText:) withObject:@"Message 2" afterDelay:length];