Как мне создать подкласс AVPlayer? - PullRequest
1 голос
/ 27 января 2012

Я работаю над подклассом AVPlayer, чтобы я мог создать метод, который skipsBackwards в очереди музыки. Я хочу создать полнофункциональный музыкальный проигрыватель, который использует музыку от пользователей iPod. Так что это означает, что AVAudioPlayer отсутствует, а также MPMusicPlayerController. Также Core Audio пугает меня, так что я надеюсь пока держаться подальше от этого.

Я рассмотрел возможность использования категорий для расширения класса AVPlayer, но мне нужно, чтобы в моем подклассе была переменная класса для хранения MPMediaItemCollection, поэтому я считаю, что имеет смысл использовать подкласс вместо добавления категории.

Вот мое исключение

! [Введите описание изображения здесь] [1]

Вот мой appDelegate-код, в котором я настраиваю AVPlayer, который подклассами является SWPlayer

#import <UIKit/UIKit.h>
#import <MediaPlayer/MediaPlayer.h>
#import <AVFoundation/AVFoundation.h>
#import <AudioToolbox/AudioToolbox.h>
#import "SWPlayer.h"


@interface AppDelegate : UIResponder <UIApplicationDelegate>

@property (strong, nonatomic) UIWindow *window;   
@property (nonatomic,retain)SWPlayer *bookPlayer;

@end

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{

    // Setup AudioSession
    NSError *sessionError = nil;
    [[AVAudioSession sharedInstance] setDelegate:self];
    [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:&sessionError];

    // Allow the audio to mix with other apps (necessary for background sound)
    UInt32 doChangeDefaultRoute = 1;
    AudioSessionSetProperty(kAudioSessionProperty_OverrideCategoryMixWithOthers, sizeof(doChangeDefaultRoute), &doChangeDefaultRoute);

    //Grab some Songs to Test with
    MPMediaQuery *query = [MPMediaQuery songsQuery];
    NSArray *collection = [query items];

    //Setup bookPLayer to Test
    MPMediaItem *item = [collection objectAtIndex:5];
    NSLog(@"%@",[item valueForProperty:MPMediaItemPropertyTitle]);
    NSURL *url = [item valueForProperty:MPMediaItemPropertyAssetURL];
    self.bookPlayer = [[SWPlayer alloc]initWithURL:url];
    [bookPlayer play];

    [bookPlayer skipForwards];

    return YES;
}

Вот мой самый базовый подкласс ...

#import <AVFoundation/AVFoundation.h>
#import <MediaPlayer/MediaPlayer.h>

@interface SWPlayer : AVPlayer

@property(nonatomic,retain)MPMediaItemCollection *mediaItemCollection;

-(void)skipForwards;
-(void)skipBackwards;

@end

#import "SWPlayer.h"

@implementation SWPlayer

@synthesize mediaItemCollection;

-(void)skipForwards{
    NSLog(@"SWPlayer called skipForward method");
}

-(void)skipBackwards{
    NSLog(@"SWPlayer called skipBackward method");

}

@end

Музыка воспроизводится с использованием моего подкласса AVPlayer. Проблема в том, что как только я вызываю skipForward метод SWPlayer, я получаю нераспознанную ошибку селектора, и приложение вылетает. Что мне здесь не хватает?

1 Ответ

3 голосов
/ 27 января 2012

Проблема в том, что вызываемый вами метод playerWithURL принадлежит AVPlayer и всегда будет возвращать AVPlayer, даже если он находится в подклассах, если вы не переопределите его. Попробуйте создать его с помощью:

self.bookPlayer = [[SWPlayer alloc] initWithURL:url];
...