我的按钮播放所有相同的声音?

时间:2013-06-07 18:20:49

标签: ios ios6

这是我的MainViewController.m

#import "MainViewController.h"

@interface MainViewController ()

@end

@implementation MainViewController 

@synthesize audioPlayer;
@synthesize soundsArray;

-(void)prepareSounds
{
    NSString *filepath= [[NSBundle mainBundle] pathForResource:@"Sounds" ofType:@"plist"];

    self.soundsArray = [[NSArray alloc] initWithContentsOfFile:filepath];

}

- (IBAction)playSound:(id)sender {

    UIButton *buttonPressed = (UIButton *)sender;

    NSString *soundName = [soundsArray objectAtIndex:(buttonPressed.tag -1)];

    NSString *path = [[NSBundle mainBundle] pathForResource:soundName ofType:@"mp3"];
    NSURL *file = [[NSURL alloc] initFileURLWithPath:path];

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

    self.audioPlayer = p;

    [self.audioPlayer play];
}

- (IBAction)playSound2:(id)sender {

    UIButton *buttonPressed = (UIButton *)sender;

    NSString *soundName = [soundsArray objectAtIndex:(buttonPressed.tag -2)];

    NSString *path = [[NSBundle mainBundle] pathForResource:soundName ofType:@"mp3"];
    NSURL *file = [[NSURL alloc] initFileURLWithPath:path];

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

    self.audioPlayer = p;

    [self.audioPlayer play];
}

- (IBAction)playSound3:(id)sender {

    UIButton *buttonPressed = (UIButton *)sender;

    NSString *soundName = [soundsArray objectAtIndex:(buttonPressed.tag -3)];

    NSString *path = [[NSBundle mainBundle] pathForResource:soundName ofType:@"mp3"];
    NSURL *file = [[NSURL alloc] initFileURLWithPath:path];

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

    self.audioPlayer = p;

    [self.audioPlayer play];
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

#pragma mark - Flipside View

- (void)flipsideViewControllerDidFinish:(FlipsideViewController *)controller
{
    [self dismissViewControllerAnimated:YES completion:nil];
}

- (IBAction)showInfo:(id)sender
{    
    FlipsideViewController *controller = [[FlipsideViewController alloc] initWithNibName:@"FlipsideViewController" bundle:nil];
    controller.delegate = self;
    controller.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
    [self presentViewController:controller animated:YES completion:nil];
}

@end

我的MainViewController.h

    #import <UIKit/UIKit.h>
#import "FlipsideViewController.h"
#import <AudioToolbox/AudioToolbox.h>
#import <AVFoundation/AVFoundation.h>


@interface MainViewController : UIViewController <FlipsideViewControllerDelegate> {

    AVAudioPlayer *audioPlayer;
    NSArray *soundsArray;
}

@property(nonatomic, retain) AVAudioPlayer *audioPlayer;
@property(nonatomic, retain) NSArray *soundsArray;

-(void)prepareSounds;
- (IBAction)playSound:(id)sender;
- (IBAction)playSound2:(id)sender;
- (IBAction)playSound3:(id)sender;

@end

在'Supporting Files'文件夹中,我有一个字符串数组,其中包含我要播放的声音文件的名称,在'Supporting Files'文件夹中我有一个名为'Sounds'的文件夹,其中包含声音文件

我的所有按钮都播放相同的声音。有人可以提供一些见解。谢谢!

3 个答案:

答案 0 :(得分:2)

我认为问题可能出在这行playSound:

NSString *soundName = [soundsArray objectAtIndex:(buttonPressed.tag -1)]

在playSound2和playSound3中用“buttonPressed.tag -2”和“buttonPressed.tag -3”重复。

如果你的buttonPressed.tags设置为1,2和3,那么每次“buttonPressed.tag -X”可能评估为0,并播放数组中第一个文件的声音。

答案 1 :(得分:2)

您正在重复执行相同任务的代码。

将所有按钮IBAction添加到单个方法(比如playSound

实施如下方法:

- (IBAction)playSound:(UIButton *)sender
{

    NSString *soundName = [soundsArray objectAtIndex:(sender.tag -1)];

    NSString *path      = [[NSBundle mainBundle] pathForResource:soundName ofType:@"mp3"];
    NSURL *file         = [[NSURL alloc] initFileURLWithPath:path];

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

    self.audioPlayer    = p;

    [self.audioPlayer play];
}

无需为每个按钮编写相同的代码。

答案 2 :(得分:1)

已解决:从未调用prepareSounds()。这是工作代码:

    #import "MainViewController.h"

@interface MainViewController ()

@end

@implementation MainViewController 

@synthesize audioPlayer;
@synthesize soundsArray;

-(void)prepareSounds
{    
    NSString *filepath= [[NSBundle mainBundle] pathForResource:@"Sound" ofType:@"plist"];

    self.soundsArray = [[NSArray alloc] initWithContentsOfFile:filepath];

}

- (void)stopAudio
{
    if (audioPlayer!= nil) {
        [audioPlayer stop];
        //do some task for changing the Image i.e setting the default image
    }

}

- (IBAction)playSound:(UIButton *)sender
{
    UIButton *btn = (UIButton*)sender;

    NSString *soundName = [soundsArray objectAtIndex:(btn.tag - 1)];

    NSString *path      = [[NSBundle mainBundle] pathForResource:soundName ofType:@"mp3"];
    NSURL *file         = [[NSURL alloc] initFileURLWithPath:path];

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

    self.audioPlayer    = p;

    if([audioPlayer isPlaying])
    {
        [self stopAudio];
    }

    [self.audioPlayer play];


}


- (void)viewDidLoad
{
    [self prepareSounds];
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

#pragma mark - Flipside View

- (void)flipsideViewControllerDidFinish:(FlipsideViewController *)controller
{
    [self dismissViewControllerAnimated:YES completion:nil];
}

- (IBAction)showInfo:(id)sender
{    
    FlipsideViewController *controller = [[FlipsideViewController alloc] initWithNibName:@"FlipsideViewController" bundle:nil];
    controller.delegate = self;
    controller.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
    [self presentViewController:controller animated:YES completion:nil];
}

@end