使用 NSUserDefaults 和 AVAudioPlayer 制作静音切换按钮

Posted

技术标签:

【中文标题】使用 NSUserDefaults 和 AVAudioPlayer 制作静音切换按钮【英文标题】:Making a Mute Toggle Button Using NSUserDefaults and AVAudioPlayer 【发布时间】:2013-01-18 20:21:56 【问题描述】:

我已经在这个项目上工作了一段时间,但是我遇到了一个我无法弄清楚的问题。

首先,我有一个复选框按钮,可以将 NSDefaultUser 作为 BOOL 值保存。它只是在按下一次时保存值 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 这样的帖子,但这仍然行不通。

我对整体编程很陌生,所以如果有人能启发我一点,那就太好了。

【问题讨论】:

【参考方案1】:

我通过使用全局模型单例来解决这个问题(正确或错误,但它对我有用)。这是一个有效维护整个应用程序状态的类。

做到这一点的方法是使用具有如下共享静态属性的类:

//// 接口

#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 实例,在创建共享实例时对其进行初始化,并在需要时将文件传递给它以进行播放。

【讨论】:

以上是关于使用 NSUserDefaults 和 AVAudioPlayer 制作静音切换按钮的主要内容,如果未能解决你的问题,请参考以下文章

为啥在 iOS 中使用 NSUserDefaults?

无法使用 NSUserDefaults 保存布尔变量

如何使用 NSUserDefaults 和 NSDateComponent 来存储?

使用 NSUserDefaults 和 AVAudioPlayer 制作静音切换按钮

如何使用 NSUserDefaults 检查当前时间和上次发布时间?

如何使用 NSUserDefaults 存储和加载 BOOL 数组或 int 数组? (IOS 7)