Ios 如何将AVPlayer子类化?

Ios 如何将AVPlayer子类化?,ios,design-patterns,avplayer,subclassing,Ios,Design Patterns,Avplayer,Subclassing,我正在创建一个子类AVPlayer,这样我就可以创建一个方法,在音乐队列中向后跳过。我想建立一个功能齐全的音乐播放器,使用来自用户iPod的音乐。因此,这意味着AVAudioPlayer以及MPMusicPlayerController已退出。核心音频也让我感到害怕,所以我希望现在能避开它 我已经考虑过使用categories来扩展AVPlayer类,但是我需要我的子类有一个class变量来存储mpmediateitemcollection,所以我认为子类比添加一个categority更有意义

我正在创建一个子类
AVPlayer
,这样我就可以创建一个方法,在音乐队列中
向后跳过
。我想建立一个功能齐全的音乐播放器,使用来自用户iPod的音乐。因此,这意味着
AVAudioPlayer
以及
MPMusicPlayerController
已退出。核心音频也让我感到害怕,所以我希望现在能避开它

我已经考虑过使用categories来扩展
AVPlayer
类,但是我需要我的子类有一个class变量来存储
mpmediateitemcollection
,所以我认为子类比添加一个categority更有意义

这是我的例外

!![在此处输入图像描述][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;
}
#导入
#进口
#进口
#进口
#导入“SWPlayer.h”
@接口AppDelegate:UIResponder
@属性(强,非原子)UIWindow*window;
@财产(非原子,保留)SWPlayer*bookPlayer;
@结束
-(BOOL)应用程序:(UIApplication*)应用程序使用选项完成启动:(NSDictionary*)启动选项
{
//设置音频会话
n错误*会话错误=nil;
[[AVAudioSession sharedInstance]setDelegate:self];
[[AVAudioSession sharedInstance]设置类别:AVAudioSessionCategoryPlayback错误:&sessionError];
//允许音频与其他应用程序混合(背景声音所需)
UInt32默认路由=1;
AudioSessionSetProperty(kAudioSessionProperty_OverrideCategoryMix with Others、sizeof(doChangeDefaultRoute)和doChangeDefaultRoute);
//抓取一些歌曲进行测试
MPMediaQuery*query=[MPMediaQuery-songsQuery];
NSArray*集合=[查询项];
//设置要测试的bookPLayer
MPMediaItem*item=[集合对象索引:5];
NSLog(@“%@,[item valueForProperty:MPMediaItemPropertyTitle]);
NSURL*url=[item valueForProperty:MPMediaItemPropertyAsetUrl];
self.bookPlayer=[[SWPlayer alloc]initWithURL:url];
[图书播放器播放];
[bookPlayer skipForwards];
返回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
#导入
#进口
@界面SWPlayer:AVPlayer
@属性(非原子,保留)MPMediaItemCollection*mediaItemCollection;
-(无效)向前滑行;
-(无效)向后滑动;
@结束
#导入“SWPlayer.h”
@SWPlayer的实现
@综合媒体收藏;
-(无效)向前滑行{
NSLog(@“SWPlayer称为skipForward方法”);
}
-(无效)向后滑动{
NSLog(@“SWPlayer调用skipBackward方法”);
}
@结束

音乐使用我的
AVPlayer
子类播放。问题是,只要我调用
SWPlayer
skipForward
方法,就会出现无法识别的选择器错误,应用程序就会崩溃。我错过了什么

问题在于,您正在调用的
playerWithURL
方法归
AVPlayer
所有,并且将始终返回
AVPlayer
,即使在子类化时也是如此,除非您重写它。尝试使用以下工具创建它:

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

np,感谢您重新设置问题格式,以便其他人可以轻松搜索它!重新格式化很好,但我花了一段时间才注意到Peter提到了“playerWithURL”-从原始帖子中删除它使我很难看出问题出在哪里。