2010-04-14 2 views
1

Я пытаюсь воспроизвести звук, на основе которого нажата кнопка с помощью AVAudioPlayer. (Это не Дека или пердеть приложение.)Воспроизведение звука на основе кнопки, нажатой на IPhone/xcode

Я соединяли все кнопки, используя этот код в файле заголовка:

@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, но я не уверен в коде для этого ,

ответ

0

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

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

+0

Может ли свойство тега быть строкой или оно должно быть числом? – slickplaid

+1

tag - целочисленное свойство класса UIView (и всех потомков, включая UIButton). Чтобы использовать любой другой объект (например, NSString) в качестве тега, создайте NSArray такого объекта и получите доступ к ним с помощью тега в качестве индекса. Например: [myString objectAtIndex: [myButton.tag]]; – Vladimir

Смежные вопросы