2

我已经查看了关于这个主题的每个发布的问题,但没有一个给我一个解决方案。我的项目在很大程度上复制了开发库中的 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

并暗示:

 @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)
4

2 回答 2

1

playbackView似乎是一个实例,UIView它没有一个名为setPlayer:. 检查您是否正在创建自己的子类的实例UIView。你能在你创建的地方发布代码片段playbackView吗?

如果您使用的是 Interface Builder,请确保您在检查器中设置了正确的类。

您将需要在代码中的某处引用该类。尝试[YOPlaybackView class]在通话上方添加setPlayer:

于 2013-07-23T10:38:50.153 回答
0

使用@FelixLam 的非常有用的建议,我设法获得了更多的日志输出数据,这些数据现在作为问题中的第三个编辑插入。第一行输出表明 Interface Builder 不知道我的自定义视图类是什么。通过在网站上进行一些搜索,我在这里找到了该问题的答案(“Unknown class <MyClass> in Interface Builder file”在运行时错误) - 结果也是我的问题的答案。

简而言之,必须将链接器标志“-ObjC”添加到项目中,这会强制链接器加载类的成员。

于 2013-07-23T11:23:08.930 回答