使用ViewController外部类的AVAudioPlayer无法正常工作

时间:2015-08-18 18:51:27

标签: ios objective-c iphone avaudioplayer

iOS及Objective-C的新手,一直在努力解决这个问题。我有一个类,它对AVAudioPlayer对象有强烈的引用,并定义了一个播放mp3的方法,具体取决于属于UIButton的参数' tag'在我的视图控制器中,我有一个方法,当按下按钮时,使用此类播放声音。但是当我运行模拟器并按下按钮时,mp3没有播放。当我不使用其他课程并让AVAudioPlayer属于我的ViewController时,请在viewDidLoad中对其进行初始化,并在IBAction方法中调用播放权,它工作正常。我检查了文件是否可用于我的项目,并且它们在代码中被正确引用。

我环顾四周,发现thisthis,但都没有解决我的问题。这是我的代码

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]下面的答案也适用。

1 个答案:

答案 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;
}