2

我在一次操作中两次更新 UILabel 时遇到了一些麻烦。基本上,用户点击播放按钮来听到声音。在播放声音时,UILabel 中出现“message 1”。声音播放完毕后,“Message 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 回答