2015-08-18 1 views
1

Новое для iOS и Objective-C, изо всех сил пытались понять это. У меня есть класс, который содержит сильную ссылку на объект AVAudioPlayer и определяет метод воспроизведения mp3 в зависимости от параметра 'tag', который принадлежит UIButton. По моему мнению, у контроллера есть метод, который использует этот класс для воспроизведения звука при нажатии кнопки. Но когда я запускаю симулятор и нажимаю кнопку, mp3 не воспроизводится. Когда я не использую другой класс и сделаю AVAudioPlayer принадлежащим моему ViewController, инициализируйте его в viewDidLoad и вызовите воспроизведение прямо в методе IBAction, он отлично работает. Я проверил, что файлы доступны для моего проекта и что они правильно указаны в коде.Использование AVAudioPlayer из класса снаружи ViewController не работает

Я огляделся и нашел 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 

Заранее спасибо

EDIT:

Глупая ошибка! Просто неправильно инициализировал свойство GuitarTuner в getter в ViewController - должно быть _tuner = [[GuitarTuner alloc] init] Ответ ниже работает тоже.

ответ

1

Try инициализацию AVAudioPlayer как этот

NSError *error; 
self.audioPlayer = [[AVAudioPlayer alloc] 
        initWithContentsOfURL:[[NSBundle mainBundle] URLForResource:note withExtension:@"mp3"] error:&error]; 

UPDATE:

Вы даете себе ответ:

Когда я не использую другой класс и сделать AVAudioPlayer принадлежат мой ViewController, инициализируйте его в viewDidLoad и правильно сыграйте в режиме воспроизведения в методе IBAction, он отлично работает.

Попробуйте Alloc tuner в viewDidLoad или создать из вашего класса GuitarTuner одноплодной и оттуда все будет гораздо проще.

комментарий Также это:

- (GuitarTuner *) tuner 
{ 
    if (!_tuner) return [[GuitarTuner alloc] init]; 
    return _tuner; 
} 
+0

Пробовал, что ошибка равна нулю. –

+0

Спасибо! Alloc'ing тюнер в viewDidLoad сделал трюк, но теперь я действительно смущен. Почему это работает? ... –