2011-06-10 127 views
-1

我在classA中播放過聲音,有沒有人知道如何在classB中停止它?從另一個班級停止聲音

我已經閱讀了幾篇文章,其中大多數只是提到了創建一個實例(即在.h中類A * a和a = [[Class A alloc] init])。這不會因爲某些原因而起作用。

下面是一些代碼: 在classA.m

path1 = [[NSBundle mainBundle] pathForResource:[@"songName" ofType:@"mp3"]; 

av1 = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath: path1] error:NULL]; 
[av1 play]; 

在classB.m,

一個= [[CLASSA的alloc] initWithNibName:無束:無];

[a.av1 stop]; 
+0

實際情況是,在A類中播放音頻,然後在classB中播放另一個音頻,所以我想先停止classA中的音頻。 – xcoder 2011-06-11 13:27:34

回答

-1

,你在這裏做什麼,

a = [[classA alloc] initWithNibName:nil bundle:nil]; 
[a.av1 stop]; 

是錯誤的。您正在創建一個全新的對象,這個對象幾乎不會播放任何音樂,並且會向其播放器發送stop消息。如果您想在其他課程中停止玩家,則必須存儲其他課程的參考文獻。如果你想保持獨立,你可以看看通知。 This是來自Apple的權威指南。基本上,這將涉及將A註冊爲通知的觀察者,然後當B準備好播放時,它將發佈關於播放音樂的通知。當A收到該通知時應關閉其音樂。

所以在Ainit,自己註冊爲觀察員,

[[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(turnOffMusic:) 
              name:@"BWillPlayMusicNotification" 
              object:nil]; 

,然後在B對象是準備播放音樂,發佈通知,

[[NSNotificationCenter defaultCenter] postNotification:@"BWillPlayMusicNotification"]; 

這將導致在A的turnOffMusic被調用,這幾乎可以做,

- (void)turnOffMusic:(NSNotification *)notification { 
    [self.av1 stop]; 
} 

記得當對象被釋放停止聽通知,

[[NSNotificationCenter defaultCenter] removeObserver:self]; 

這種方法可以讓你保持兩類獨立。

+0

非常感謝你!你很棒!! – xcoder 2011-06-11 20:01:39

+0

只是爲了增加一些內容,我認爲第二部分應該是[[NSNotificationCenter defaultCenter] postNotificationName:@「BWillPlayMusicNotification」object:nil]; – xcoder 2011-06-11 20:02:56

+0

@xcoder,這是做這件事的一種方式,但是你的主要問題是你不瞭解OOP的基本概念。你需要了解類和對象之間的區別。看看命名約定也不會傷害你。正確命名的類的示例:'ClassA'(注意大寫C)和一個正確命名的對象:'objectA'。 – 2011-06-11 21:54:28

0

你知道如何阻止A班的聲音嗎?

只是做同樣的事情,但在B類

+0

音頻在classA中播放,所以只需調用[audioClassB stop]將不起作用... – xcoder 2011-06-11 13:24:42

+0

@xcoder,然後從B類的A類呼叫停止。 – 2011-06-11 16:06:24

+0

這正是我的問題=]它由於某些原因不起作用 – xcoder 2011-06-11 17:26:42