iOS及Objective-C
的新手,一直在努力解决这个问题。我有一个类,它对AVAudioPlayer
对象有强烈的引用,并定义了一个播放mp3的方法,具体取决于属于UIButton
的参数' tag'在我的视图控制器中,我有一个方法,当按下按钮时,使用此类播放声音。但是当我运行模拟器并按下按钮时,mp3没有播放。当我不使用其他课程并让AVAudioPlayer
属于我的ViewController
时,请在viewDidLoad
中对其进行初始化,并在IBAction
方法中调用播放权,它工作正常。我检查了文件是否可用于我的项目,并且它们在代码中被正确引用。
我环顾四周,发现this和this,但都没有解决我的问题。这是我的代码
GuitarTuner.h
#import <Foundation/Foundation.h>
#import <AVFoundation/AVFoundation.h>
@interface GuitarTuner : NSObject
- (void) play: (NSUInteger)tag;
@end
GuitarTuner.m
#import "GuitarTuner.h"
#import <AVFoundation/AVFoundation.h>
@interface GuitarTuner()
@property (strong, nonatomic) AVAudioPlayer *audioPlayer;
@end
@implementation GuitarTuner
- (void) play:(NSUInteger)tag
{
NSString *note;
switch (tag) {
case 0:
note = @"Low-E";
break;
case 1:
note = @"A";
break;
case 2:
note = @"D";
break;
case 3:
note = @"G";
break;
case 4:
note = @"B";
break;
case 5:
note = @"Hi-E";
break;
}
NSString *path = [[NSBundle mainBundle] pathForResource:note ofType:@"mp3"];
NSURL *soundURL = [NSURL fileURLWithPath:path];
self.audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:soundURL error:nil];
[self.audioPlayer play];
}
@end
ViewController.m
#import "ViewController.h"
#import "GuitarTuner.h"
@interface ViewController ()
@property (strong, nonatomic) GuitarTuner *tuner;
@end
@implementation ViewController
- (GuitarTuner *) tuner
{
if (!_tuner) return [[GuitarTuner alloc] init];
return _tuner;
}
- (IBAction)noteButton:(id)sender
{
UIButton *button = (UIButton*)sender;
[self.tuner play:button.tag];
}
@end
提前致谢
编辑:
愚蠢的错误!只是没有在ViewController的getter中正确初始化GuitarTuner属性 - 应该是_tuner = [[GuitarTuner alloc] init]
下面的答案也适用。
答案 0 :(得分:1)
尝试像这样初始化AVAudioPlayer
NSError *error;
self.audioPlayer = [[AVAudioPlayer alloc]
initWithContentsOfURL:[[NSBundle mainBundle] URLForResource:note withExtension:@"mp3"] error:&error];
更新:
你给自己答案:
当我不使用其他类并使AVAudioPlayer属于 我的ViewController,在viewDidLoad中初始化它,并调用右边的游戏 在IBAction方法中,它工作正常。
尝试在viewDidLoad中分配tuner
或从您的班级GuitarTuner
创建一个单身人士,从那里一切都会更容易。
同时评论此事:
- (GuitarTuner *) tuner
{
if (!_tuner) return [[GuitarTuner alloc] init];
return _tuner;
}