2011-06-20 19 views
0

我有一个播放两种声音的程序。我希望用户知道哪些声音正在播放,所以我有两个大按钮图像。我有三种不同的观点,我想交换 - 两个按钮都是红色的(没有任何播放),两个按钮之一是绿色的(显示哪个播放)。在Objective-C播放声音之前更改视图

我得到的主要问题是我的声音在视图交换之前播放并完成! (在播放声音之前,我正在使用[window setContentView:firstSound])

修改后的视图最终会显示出来,但只有在播放wavs的方法结束后才会显示。

我使用NSSound播放声音文件(它们都是短wav文件,所以我认为它适用)

任何人都知道我做了什么错?或者如果有另一种方式我可以做到这一点?谢谢堆!

编辑:我遵循了建议,以便只有图像被更改(而不是视图),但也会发生同样的问题。声音播放结束后会发生更新。

下面的代码:

-(void)readWavs{

//[window setContentView:firstWav]; 

[redButton setHidden:YES]; 

NSString *resourcePath = [[NSBundle mainBundle] pathForResource:@"fish" ofType:@"wav"]; 
NSSound *sound = [[NSSound alloc] initWithContentsOfFile:resourcePath byReference:YES]; 
[sound play]; 
sleep(3); //needed so that the sound will actually play 
[sound stop]; 
[sound release]; 


//[redButton setHidden:NO]; 
//[window setContentView:testView]; 

sleep(2); 

//[window setContentView:secondWav]; 

NSString *resourcePath2 = [[NSBundle mainBundle] pathForResource:@"fish" ofType:@"wav"]; 
NSSound *sound2 = [[NSSound alloc] initWithContentsOfFile:resourcePath2 byReference:YES]; 
[sound2 play]; 
sleep(3); 
[sound2 stop]; 
[sound2 release]; 

}

“的”绿色按钮播放声音之前应显示出来,但它只做方法是这样做了。

+0

它可能有助于发布播放声音的代码并交换视图。 – PengOne

+0

当然可以:)我已经更新了它。 – Moonlight293

回答

1

你用这些sleep() s阻止运行循环。在当前事件的所有处理完成之前,不会更新显示,直到此readWavs方法完成才会发生。

如果您想在声音完成后执行某些操作,请为其指定一个委托(可能与启动声音的对象相同)并实施NSSoundDelegate-sound:didFinishPlaying:方法。然后,在readWavs中,只需启动声音并返回 - 您的委托方法将在完成时调用,并且由于readWavs立即返回,因此它不会阻止运行循环。

+0

如果我希望在播放声音之前和播放声音之前发生,而不是之后呢? (另外,我觉得睡觉是狡猾的 - 但是如果我没有听到声音就会碰到对方) – Moonlight293

+0

但是你*确实想在声音结束后做些事情 - 开始下一个声音。这才是重点;您可以使用运行循环在每个声音完成时得到通知,而不是用'sleep()'来阻止它。隐藏红色按钮,然后开始第一个声音。当你拿到'-sound:didFinishPlaying:'时,显示红色按钮并开始第二个声音。等等...... –

+0

贺雅 - 我已经完成了你的建议,它确实有效(声音现在正在播放他们的全长),但我仍然有图像问题。它通常只会改变一次,然后再也不会改变。我有readWavs调用playSound1 - >播放声音,隐藏红色并设置代表。然后代表调用playsSound2,它显示前一个红色按钮并隐藏另一个(但这不起作用)。 有什么建议吗? – Moonlight293

2

我不确定自己是否正确理解,但是当播放声音时显示正在播放的声音(图像)时,您试图切换到完全不同的视图听起来如何?如果是这样,你应该只使用imageView.hidden = YES和imageView.hidden = NO来显示基于声音的正确图像。更好的是,您可以使用一个图像视图并根据声音更改图像视图中显示的图像。

+0

哈哈,这将是一个非常合乎逻辑的方式去做! xD我会尽力做到:) – Moonlight293

+0

贺雅,它仍然有同样的问题。我现在将把我的代码放在原始文章中。 – Moonlight293