2

1 回のアクションで UILabel を 2 回更新するホットな方法を見つけるのに苦労しています。基本的に、ユーザーは再生ボタンを押して音を聞きます。サウンドが再生されている間、「メッセージ 1」が UILabel に表示されます。サウンドの再生が完了すると、同じラベルに「メッセージ 2」が表示されます。これを実行すると、ラベルは「メッセージ 2」に直接移動します。

.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";   
}
4

2 に答える 2

5

プロトコルを実装しているのを見たAVAudioPlayerDelegateので、ある時点でプレイヤーのデリゲートをself

その場合は、プレイ方法を次のように変更してください。

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

次に、このメソッドを実装します。

- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag
{
    answerLabel.text = @"Message 2";
}
于 2012-05-08T18:05:11.253 に答える
2

UI の更新は、UI スレッドのブロックが解除されたときにのみ発生し、スリープ中もブロックされているため、最初のラベルは表示されません。

あなたができることは次のとおりです。

answerLabel.text = @"Message 1";
[answerLabel performSelector:@selector(setText:) withObject:@"Message 2" afterDelay:length];
于 2012-05-08T18:00:34.900 に答える