Я пытаюсь воспроизвести звук, на основе которого нажата кнопка с помощью 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, но я не уверен в коде для этого ,
Может ли свойство тега быть строкой или оно должно быть числом? – slickplaid
tag - целочисленное свойство класса UIView (и всех потомков, включая UIButton). Чтобы использовать любой другой объект (например, NSString) в качестве тега, создайте NSArray такого объекта и получите доступ к ним с помощью тега в качестве индекса. Например: [myString objectAtIndex: [myButton.tag]]; – Vladimir