1

AVAudioPlayer を使用して、どのボタンが押されたかに基づいてサウンドを再生しようとしています。 (これはサウンドボードやおならのアプリではありません。)

ヘッダー ファイルで次のコードを使用して、すべてのボタンをリンクしました。

@interface appViewController : UIViewController <AVAudioPlayerDelegate> {

AVAudioPlayer *player;

UIButton *C4;
UIButton *Bb4;
UIButton *B4;
UIButton *A4;
UIButton *Ab4;
UIButton *As4;
UIButton *G3;
UIButton *Gb3;
UIButton *Gs3;
UIButton *F3;
UIButton *Fs3;
UIButton *E3;
UIButton *Eb3;
UIButton *D3;
UIButton *Db3;
UIButton *Ds3;
UIButton *C3;
UIButton *Cs3;
}

@property (nonatomic, retain) AVAudioPlayer *player;

@property (nonatomic, retain) IBOutlet UIButton *C4;
@property (nonatomic, retain) IBOutlet UIButton *B4;
@property (nonatomic, retain) IBOutlet UIButton *Bb4;
@property (nonatomic, retain) IBOutlet UIButton *A4;
@property (nonatomic, retain) IBOutlet UIButton *Ab4;
@property (nonatomic, retain) IBOutlet UIButton *As4;
@property (nonatomic, retain) IBOutlet UIButton *G3;
@property (nonatomic, retain) IBOutlet UIButton *Gb3;
@property (nonatomic, retain) IBOutlet UIButton *Gs3;
@property (nonatomic, retain) IBOutlet UIButton *F3;
@property (nonatomic, retain) IBOutlet UIButton *Fs3;
@property (nonatomic, retain) IBOutlet UIButton *E3;
@property (nonatomic, retain) IBOutlet UIButton *Eb3;
@property (nonatomic, retain) IBOutlet UIButton *D3;
@property (nonatomic, retain) IBOutlet UIButton *Db3;
@property (nonatomic, retain) IBOutlet UIButton *Ds3;
@property (nonatomic, retain) IBOutlet UIButton *C3;
@property (nonatomic, retain) IBOutlet UIButton *Cs3;

- (IBAction) playNote;

@end

ボタンはすべて interfaceBuilder のイベント「playNote」にリンクされ、各ノートはノート名に従って適切な参照アウトレットにリンクされます。

すべての *.mp3 サウンド ファイルは、UIButton 名に基づいて命名されます (IE-C3 == C3.mp3)。

私の実装ファイルでは、C3 ボタンが押されたときに 1 つのノートのみを再生するようにしています。

#import "sonicfitViewController.h"

@implementation appViewController
@synthesize C3, Cs3, D3, Ds3, Db3, E3, Eb3, F3, Fs3, G3, Gs3, A4, Ab4, As4, B4, Bb4, C4;

// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad {

    NSString *path = [[NSBundle mainBundle] pathForResource:@"3C" ofType:@"mp3"];
    NSLog(@"path: %@", path);
    NSURL *file = [[NSURL alloc] initFileURLWithPath:path];

    AVAudioPlayer *p = [[AVAudioPlayer alloc]
                        initWithContentsOfURL:file error:nil];
    [file release];

    self.player = p;
    [p release];

    [player prepareToPlay];
    [player setDelegate:self];

    [super viewDidLoad];
}

- (IBAction) playNote {
    [self.player play];
}

さて、上記には2つの問題があります。

  • まず、ファイルを再生しようとすると、NSLog が NULL を報告し、クラッシュします。mp3 を resources フォルダーに追加しましたが、それらはリンクされているだけでなく、コピーされています。リソースフォルダーの下のサブフォルダーにはありません。
  • 第二に、ボタン C3 が押されたときに C3.mp3 を再生し、F3 が F3.mp3 を再生するように、ボタンごとに重複するコード行を記述せずに設定するにはどうすればよいですか? playNote は次のようになります

    NSString *path = [[NSBundle mainBundle] pathForResource:nameOfButton ofType:@"mp3"];

明確に定義する代わりに (@"C3")。

これを行うためのより良い方法はありますか?また、アプリをロードすると *path が NULL を報告してクラッシュするのはなぜですか?

- (IBAction) playNote:buttonName に追加の変数入力を追加し、 AVAudioPlayer を呼び出すすべてのコードを playNote 関数に入れるのと同じくらい簡単だと確信していますが、これを行うコードがわかりません。

4

1 に答える 1

0

同じセレクターで複数のアクションを実行することは、一般的なタスクです。各ボタンのタグ プロパティを設定し、NSString の NSArray を使用してファイル名を保存するだけです。各ボタンを個別に作成する必要さえありません。iphone のセレクターに関する同様の質問の問題については、コード サンプルを参照してください。答え。

ファイルが本当にバンドルにコピーされているかどうかを確認してください。たとえば、シミュレーターでは、バンドル ディレクトリを NSLog(@"myBundle:%@",[[NSBundle mainBundle] bundlePath]); でログに記録します。そしてファイルを見てください。

于 2010-04-14T23:56:15.367 に答える