0

このプロジェクトにしばらく取り組んでいますが、理解できない問題に遭遇しました。

まず、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 メソッドを数日間いじりましたが、思うような結果が得られませんでした。アプリのサウンドを無効にするなどの投稿を調査して見つけましたが、それでもうまくいきません。

私は全体的にプログラミングにかなり慣れていないので、誰かが私を少し啓発できれば素晴らしいと思います。

4

1 に答える 1

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 インスタンスへの参照を保持し、共有インスタンスの作成時に初期化して、必要に応じてファイルを渡して再生することもできます。

于 2013-05-28T13:07:56.920 に答える