将数据传递给我的自定义NSObject?

时间:2012-01-05 17:23:29

标签: ios xcode audio

我试图创建我的第一个自定义类“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];
}

2 个答案:

答案 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的自定义方法。