Передача данных в мой пользовательский NSObject? - PullRequest
0 голосов
/ 05 января 2012

Я попытался создать свой первый пользовательский класс "AudioPlayer".Я хочу передать данные (название аудио) из таблицы в мой «AudioPlayer» и загрузить AudioPlayer с initWithContentsOfURL: [NSURL fileURLWithPath: path] , но когда я выделяю «AudioPlayer» в моем «MainViewController»я получаю сообщение об ошибке "Несовместимые типы указателей, инициализирующие 'Audio Player * ___ strong' с выражением типа AVAudioPLayer *".Мой вопрос: как бы я инициализировал свой пользовательский аудиоплеер с названием выбранного аудио в качестве URL?Он отлично работает, когда я создал переменную AVAudioPlayer, но я не знаю, как передать ее в свой пользовательский класс.

Вот мой пользовательский класс Header ..

#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 голосов
/ 05 января 2012

Я думаю, вы путаете свой пользовательский класс с классом 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];

Или вы можете использовать категории для добавления пользовательских методов, добавленных в AVAudioPlayer.

0 голосов
/ 05 января 2012

Созданный вами объект AudioPlayer не относится к типу AVAudioPlayer, поэтому я думаю, что следующая строка: AudioPlayer * audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL: [NSURL fileURLWithPath: path] ошибка: NULL];

следуетбыть чем-то вроде: AudioPlayer * audioPlayer = [[AudioPlayer alloc] init];

, который создаст объект вашего пользовательского класса.У вас есть по крайней мере несколько вариантов для передачи информации NSURL, такой как добавление параметров в ваш метод init пользовательских классов или создание другого свойства в вашем пользовательском классе, которое вы устанавливаете сразу после создания вашего объекта.

В вашемВ пользовательский класс AudioPlayer вы можете добавить новый атрибут my URL:

@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];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...