我查看了有关此主题的每个帖子,但没有人给我一个解决方案。
我的项目在很大程度上复制了开发库中的AVPlayer演示应用程序(减去了清理功能):我有一个复制并粘贴AVPlayerDemoPlaybackView
类(重命名为YOPlaybackView
)和一个相关的控制器,以及一个非常相似的xib(减去洗涤器)。
我的视图控制器代码非常接近演示中的模式(为简洁起见,下面仅发布了代码差异)。
我已经通过在dealloc
当玩家的当前项目更改/将更改时,observeValueForKeyPath
方法中会发生错误。以下行给出错误“ - [UIView SetPlayer:]”:无法识别的选择器发送到实例...“
[playbackView setPlayer:player];
如果我在此调用之前创建该视图的实例,则不会收到错误:
YOPlaybackView* vw = [[YOPlaybackView alloc] init];
[playbackView setPlayer:player];
在我看来,它可能与nib延迟加载有关(并且创建一个实例将其踢入生活)。
在调试器窗口中,无论有没有创建(未使用)实例的额外行,playbackView似乎都是有效的。
有人可以帮助我提升我的对象/应用程序生命周期知识吗?
编辑 - 响应包含IB评论的建议答案
这是IB的快照,在检查器中显示视图层次结构和正确命名的自定义视图。
编辑 - 回答有关有效SetPlayer的问题
有问题的视图类如下所示:
@class AVPlayer;
@interface YOPlaybackView : UIView
@property (nonatomic, retain) AVPlayer* player;
- (void)setPlayer:(AVPlayer*)player;
@end
和impl:
@implementation YOPlaybackView
+ (Class)layerClass
{
return [AVPlayerLayer class];
}
- (AVPlayer*)player
{
return [(AVPlayerLayer*)[self layer] player];
}
- (void)setPlayer:(AVPlayer*)player
{
[(AVPlayerLayer*)[self layer] setPlayer:player];
}
@end
修改 - 输出日志
2013-07-23 12:05:39.084 iOSVideoPlayerExample[8331:14003] Unknown class YOPlaybackView in Interface Builder file.
2013-07-23 12:05:39.956 iOSVideoPlayerExample[8331:14003] Unbalanced calls to begin/end appearance transitions for <YOMasterViewController: 0x985aa10>.
2013-07-23 12:05:40.428 iOSVideoPlayerExample[8331:14003] <UIView: 0x8383900; frame = (0 0; 320 480); autoresize = W+H; layer = <CALayer: 0x8381710>>
2013-07-23 12:05:40.429 iOSVideoPlayerExample[8331:14003] -[UIView setPlayer:]: unrecognized selector sent to instance 0x8383900
(lldb)
答案 0 :(得分:1)
您的playbackView
似乎是UIView
的实例,其中没有名为setPlayer:
的方法。检查您是否正在创建自己的UIView
子类的实例。您是否可以在创建playbackView
?
如果您使用的是Interface Builder,请确保在检查器中设置了正确的类。
您需要在代码中的某处引用该类。尝试在[YOPlaybackView class]
电话正上方添加setPlayer:
。
答案 1 :(得分:0)
使用@FelixLam非常有用的建议我设法获得更多日志输出数据,现在作为问题中的第三个编辑插入。第一行输出表明Interface Builder不知道我的自定义视图类是什么。通过在网站上进行一些搜索,我在这里找到了问题的答案("Unknown class <MyClass> in Interface Builder file" error at runtime) - 这也是我的问题的答案。
简而言之,必须将链接器标志“-ObjC”添加到项目中,这会强制链接器加载类的成员。