9

我正在使用 QTMovieView,有时,我会收到以下日志,然后是未知的选择器异常。该程序具有供用户设置显示和隐藏 QTMovieView 控制器的选项。程序链接的 SDK 是 10.7

“[StdMovieUISliderCell sliderType]:发送到实例的无法识别的选择器”

谢谢你的帮助

4

4 回答 4

6

这看起来像是 OS X Mountain Lion 10.8 中引入的错误(编辑:也有关于 OS X 10.7 的报告,请参阅下面的评论)。我想这QTMovieView将在下一个主要的 OS X 版本中被弃用。最好的解决方案是转到 AV Foundation(AVPlayer和相应的AVPlayerLayer课程)。Apple 有一些关于使用此框架播放资产的文档

也就是说,如果你不能更新到 AV Foundation 或者你不能关闭Auto Layout,你仍然可以通过在运行时动态添加缺少的方法来解决这个问题StdMovieUISliderCell。确保添加Objective C 运行时头文件并尽早添加方法(例如+ (void)load在您的应用程序委托中)。出于 App Store 静态分析器拒绝 foo 的原因,在类名中添加一些简单的编码(如 rot13)也是安全的。

// Make sure that we have the right headers.
#import <objc/runtime.h>

// The selectors should be recognized by class_addMethod().
@interface NSObject (SliderCellBugFix)

- (NSSliderType)sliderType;
- (NSInteger)numberOfTickMarks;

@end

// Add C implementations of missing methods that we’ll add
// to the StdMovieUISliderCell class later.
static NSSliderType SliderType(id self, SEL _cmd)
{
  return NSLinearSlider;
}

static NSInteger NumberOfTickMarks(id self, SEL _cmd)
{
  return 0;
}

// rot13, just to be extra safe.
static NSString *ResolveName(NSString *aName)
{
  const char *_string = [aName cStringUsingEncoding:NSASCIIStringEncoding];
  NSUInteger stringLength = [aName length];
  char newString[stringLength+1];

  NSUInteger x;
  for(x = 0; x < stringLength; x++)
  {
    unsigned int aCharacter = _string[x];

    if( 0x40 < aCharacter && aCharacter < 0x5B ) // A - Z
      newString[x] = (((aCharacter - 0x41) + 0x0D) % 0x1A) + 0x41;
    else if( 0x60 < aCharacter && aCharacter < 0x7B ) // a-z
      newString[x] = (((aCharacter - 0x61) + 0x0D) % 0x1A) + 0x61;
    else  // Not an alpha character
      newString[x] = aCharacter;
  }
  newString[x] = '\0';

  return [NSString stringWithCString:newString encoding:NSASCIIStringEncoding];
}

// Add both methods if they aren’t already there. This should makes this
// code safe, even if Apple decides to implement the methods later on.
+ (void)load
{
  Class MovieSliderCell = NSClassFromString(ResolveName(@"FgqZbivrHVFyvqrePryy"));

  if (!class_getInstanceMethod(MovieSliderCell, @selector(sliderType)))
  {
    const char *types = [[NSString stringWithFormat:@"%s%s%s",
      @encode(NSSliderType), @encode(id), @encode(SEL)] UTF8String];
    class_addMethod(MovieSliderCell, @selector(sliderType),
      (IMP)SliderType, types);
  }
  if (!class_getInstanceMethod(MovieSliderCell, @selector(numberOfTickMarks)))
  {
    const char *types = [[NSString stringWithFormat: @"%s%s%s",
      @encode(NSInteger), @encode(id), @encode(SEL)] UTF8String];
    class_addMethod(MovieSliderCell, @selector(numberOfTickMarks),
      (IMP)NumberOfTickMarks, types);
  }
}

在实现这两种方法时,我做了两个假设:

  1. 电影视图只能有一个线性滑块,不能有一个圆形滑块。
  2. 电影视图不会有刻度线。

如果你的电影有章节,后者可能是个问题,但我不知道它们是如何处理的,因为我不需要或使用它们。

于 2012-09-10T14:32:23.647 回答
1

如果我尝试使用 setMovie: 并启用 AutoLayout,我也会遇到同样的问题。Xcode 4.4.1 的更新解决了这个问题。

于 2012-08-08T09:19:26.923 回答
1

我知道这是一个相当老的帖子,但对于其他人来说,我遇到了同样的问题,我刚刚为包含 QTMovieView 的 xib 文件停用了可可自动布局,它的工作方式与它应该有的一样。

我目前在 OSX 10.7.4 下使用 xcode 4.5.2

于 2013-04-08T11:02:54.317 回答
0

通过在 QtMovieView 子类中添加空的 updateConstraintsForSubtreeIfNeeded 方法来修复此问题。

于 2014-04-03T09:16:53.053 回答