2012-05-08 3 views
2

UILabelを一度に2回更新するのに苦労します。基本的に、ユーザは再生ボタンを押して音を聞く。サウンドが再生されている間、UILabelに「メッセージ1」が表示されます。サウンドが再生されると、「メッセージ2」が同じラベルに表示されます。これを実行すると、ラベルは直接「メッセージ2」になります。同じ方法でUILabelを2回更新する

@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"; 
} 

を次にこのメソッドを実装210

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

これはうまくいき、私の心は空になり、audioPlayerDidFinishPlayingの部分が見落とされたと思います。[NSThread sleepForTimeInterval:length]部分は必要ありません。 – SNV7

2

がUIへの更新は、まだブロックされて寝たときに最初のラベルが表示されませんので、UIスレッドが、ブロックが解除され、1回だけ実行の.h

。あなたは何ができるか

は次のとおりです。

answerLabel.text = @"Message 1"; 
[answerLabel performSelector:@selector(setText:) withObject:@"Message 2" afterDelay:length]; 
関連する問題