我已经在这个项目上工作了一段时间,但我遇到了一个我无法弄清楚的问题。
首先,我有一个复选框按钮,可以将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)播放方法搞砸了几天,但我无法获得我想要的结果。我研究并找到了像Disable in App sounds这样的帖子,但这仍然不会这样做。
我对整体编程很陌生,所以如果有人能给我一点启发,那就太好了。
答案 0 :(得分:0)
我通过使用全局模型单例来解决这个问题(正确或错误,但它对我有用)。这是一个有效维护整个应用程序状态的类。
这样做的方法是使用一个具有共享静态属性的类:
////接口
#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实例,在创建共享实例时启动它,并在需要时将文件传递给它。