Новое для 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]
Ответ ниже работает тоже.
Пробовал, что ошибка равна нулю. –
Спасибо! Alloc'ing тюнер в viewDidLoad сделал трюк, но теперь я действительно смущен. Почему это работает? ... –