2013-01-18 22 views
0

我一直在研究這個項目一段時間,但是我遇到了一個我無法弄清楚的問題。使用NSUserDefaults和AVAudioPlayer製作靜音切換按鈕

首先,我有一個複選框按鈕,將其作爲BOOL值保存到NSDefaultUser。它只是按下一次時保存值YES,如果再次按下則保存爲NO等...此複選框按鈕正常工作,就像正常的自定義複選框按鈕一樣。

我想通過使用此複選框按鈕來使我的應用程序中的所有聲音靜音。

我打我的聲音通過調用方法如:

- (void)startMusic1 
{ 
    NSURL *url = [NSURL fileURLWithPath:[NSString stringWithFormat:@"%@/music1.mp3", [[NSBundle mainBundle] resourcePath]]]; 

    NSError *error; 
     AVAudioPlayer *audioPlayer; 
    audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:&error]; 
    audioPlayer.numberOfLoops = -1; 

    if (audioPlayer == nil) 
      NSLog(@"Error: %@", [error description]); 
    else 
    [audioPlayer play]; 
} 

因此,對於每一個聲音我想在我的應用程序玩,我可以重複這樣的:

- (IBAction)playButton:(id)sender 
{ 
    NSUserDefaults *default = [NSUserDefaults standardUserDefaults]; 
    if(![default boolForKey:@"isMuted"]) 
    { 
     [self startMusic1]; 
    } 
} 

但是,這得到了重複,尤其是因爲我必須爲我的項目管理許多不同的聲音(以及播放聲音的不同按鈕),而且重複這些步驟似乎並不重要。我試着用AVAudioPlayer的一個子類創建一個新類,並使用 - (BOOL)play方法搞了幾天,但是我無法設法得到我想要的結果。我研究並找到像Disable in App sounds這樣的帖子,但這仍然不會。

我對整體編程非常新穎,所以如果有人能給我一點啓發,那將會很棒。

回答

0

我通過使用全局模型singleton來解決這個問題(正確或錯誤,但它適用於我)。這是一個在整個應用程序中有效維護狀態的類。

做到這一點的方法是使用具有共享靜態屬性是這樣一類:

////接口

#import <Foundation/Foundation.h> 

@interface AudioModel 
@property (nonatomic) BOOL playAudio; 
+(id)sharedInstance; 

@end 

////實施

#import "AudioModel.h" 

@implementation AudioModel 

// property for toggling audio on or off 
@synthesize playAudio = _playAudio; 

// singleton model variable 
static AudioModel* audio = nil; 

-(BOOL)playAudio { 
    return _playAudio; 
} 

-(void)setPlayAudio:(BOOL)playAudio { 
    _playAudio = playAudio; 
} 

// static 
+(AudioModel*)sharedInstance { 
    if(audio == nil) 
    { 
     audio = [[AudioModel alloc]init]; 
    } 

    return audio; 
} 

-(AudioModel*)init { 

    self = [super init]; 

    if(self){ 
     // set up default sounds on 
     // this may read from your stored value 
     _playAudio = YES; 
    } 
} 

@end 

然後當你想讀取或寫入這個全局可用的單例模型時,你可以在你的控制器中設置一個變量,如下所示:

AudioModel *volumeControl = [AudioModel sharedInstance]; 

if(volumeControl.playAudio){ 
    // method to play audio passing audio file name... 
} 

您也可以在此類中引用您的AVAudioPlayer實例,在創建共享實例時將其初始化,並在需要時將文件傳遞給它以播放。