Воспроизвести звук на основе кнопки, нажатой на IPhone / xcode - PullRequest
1 голос
/ 15 апреля 2010

Я пытаюсь воспроизвести звук в зависимости от того, какая кнопка нажата с помощью 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

Все кнопки связаны с событием "playNote" в interfaceBuilder, и каждая заметка связана с соответствующим выходом ссылки в соответствии с именем заметки.

Все * .mp3 звуковые файлы названы в честь имени UIButton (IE-C3 == C3.mp3).

В моем файле реализации у меня есть это, чтобы играть только одну ноту, когда нажата кнопка C3:

#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];
}

Теперь, с вышесказанным у меня есть две проблемы:

  • Сначала NSLog сообщает о NULL и вылетает при попытке воспроизвести файл. Я добавил mp3 в папку ресурсов, и они были скопированы, а не просто связаны. Они не находятся в подпапках в папке ресурсов.
  • Во-вторых, как я могу настроить его таким образом, чтобы при нажатии, скажем, кнопки C3 он воспроизводил C3.mp3, а F3 воспроизводил F3.mp3 без записи повторяющихся строк кода для каждой отдельной кнопки? playNote должно быть похоже на

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

вместо его конкретного определения (@ "C3").

Есть ли лучший способ сделать это, и почему * путь сообщает NULL и вылетает при загрузке приложения?

Я почти уверен, что это так же просто, как добавить дополнительные переменные входы в - (IBAction) playNote: buttonName и поместить весь код для вызова AVAudioPlayer в функцию playNote, но я не уверен в коде, чтобы сделать это. 1033 *

1 Ответ

0 голосов
/ 15 апреля 2010

Выполнение нескольких действий с одним и тем же селектором является обычной задачей. Просто установите свойство тега для каждой кнопки и используйте NSArray из NSStrings для хранения имен файлов. Вам даже не нужно создавать каждую кнопку отдельно. См. Пример кода для аналогичного вопроса проблема с селектором в iphone? ответ.

Проверьте, действительно ли ваши файлы скопированы в пакет. Например в симуляторе зарегистрируйте каталог вашего пакета с помощью NSLog (@ "myBundle:% @", [[NSBundle mainBundle] bundlePath]); и посмотрите на файлы.

...