我试图创建我的第一个自定义类“AudioPlayer”。我想将数据(音频标题)从tableview传递到我的“AudioPlayer”并使用 initWithContentsOfURL加载AudioPlayer:[NSURL fileURLWithPath:path] 但是当我在“MainViewController”中分配“AudioPlayer”时“我得到错误”不兼容的指针类型初始化'音频播放器* ___强'与AVAudioPLayer *的类型和表达式“。我的问题是,如何使用选定的音频标题作为URL初始化我的自定义音频播放器?当我创建一个AVAudioPlayer变量时它工作正常,但我不知道如何将它传递给我的自定义类。
这是我的自定义类标题..
#import <Foundation/Foundation.h>
#import <AVFoundation/AVFoundation.h>
#import <AudioToolbox/AudioToolbox.h>
@interface AudioPlayer : NSObject{
AVAudioPlayer *audioPlayer;
//Volume slider
NSTimer *volumeTimer;
IBOutlet UISlider *volumeSlider;
}
-(bool) isPlaying;
-(bool) isPaused;
-(void)playPause:(id)sender;
@property (nonatomic, retain) AVAudioPlayer *audioPlayer;
@end
这是我的自定义类实现文件......
#import "AudioPlayer.h"
@implementation AudioPlayer
@synthesize audioPlayer;
-(void)playPause{
if ([audioPlayer isPlaying]) {
[audioPlayer pause];
} else {
[audioPlayer play];
}
}
-(void)volumeSlider
{
//Setup the volume slider
volumeTimer = [NSTimer scheduledTimerWithTimeInterval:0 target:self selector:@selector(updateVolumeSlider) userInfo:nil repeats:YES];
[audioPlayer setVolume:volumeSlider.value];
}
@end
这是MainView实现......
- (void)viewDidLoad
{
[super viewDidLoad];
//Instantiate performanceArray
performanceArray = [[NSMutableArray alloc]initWithObjects:@"Centering", nil];
//Instantiate recoveryArray
recoveryArray = [[NSMutableArray alloc]initWithObjects:@"Power Nap", nil];
//Instantiate the AudioPlayer
UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:self.tableView.indexPathForSelectedRow];
NSString *path = [[NSBundle mainBundle] pathForResource:cell.textLabel.text ofType:@"m4a"];
AudioPlayer *audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path] error:NULL];
[audioPlayer.audioPlayer prepareToPlay];
}
答案 0 :(得分:0)
您创建的AudioPlayer对象不是AVAudioPlayer类型,所以我认为以下行: AudioPlayer * audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path] error:NULL];
应该是这样的:AudioPlayer * audioPlayer = [[AudioPlayer alloc] init];
将创建自定义类的对象。您至少有几个选项可以传递NSURL信息,例如将params添加到自定义类init方法或在您创建对象后立即创建的自定义类中创建另一个属性。
在自定义类AudioPlayer中,您可以添加新的我的网址属性:
@interface AudioPlayer : NSObject{
AVAudioPlayer *audioPlayer;
//Volume slider
NSTimer *volumeTimer;
IBOutlet UISlider *volumeSlider;
NSURL* myURL;
}
然后在AudioPlayer的实现文件中添加以下init方法:
-(id)initWithURL:(NSURL)theURL
{
self = [super init];
if (self) {
// perform initialization of object here
myURL = theURL;
}
return self;
}
然后在您的MainView中,您可以执行以下操作:
NSURL* theURL = [NSURL fileURLWithPath:path];
AudioPlayer *audioPlayer = [[AudioPlayer alloc] initWithURL:theURL];
答案 1 :(得分:0)
我认为您将自定义类与AVAudioPlayer类混淆。 如果您尝试向AVAudioPlayer的默认类添加更多方法和选项,则应该继承AVAudioPlayer而不是NSObject。
#import <Foundation/Foundation.h> #import <AVFoundation/AVFoundation.h> #import <AudioToolbox/AudioToolbox.h> @interface AudioPlayer : AVAudioPlayer // the rest of your code
然后当 deanandreakis 回答时,你需要分配/初始化你的类而不是AVAudioPlayer。
含义:
AudioPlayer *audioPlayer = [[AudioPlayer alloc] init];
或者您可以使用categories添加添加到AVAudioPlayer的自定义方法。