有没有人见过"[StdMovieUISliderCell sliderType]:无法识别的选择器发送到实例"

psk*_*svp 9 cocoa osx-lion

我正在使用QTMovieView,有时,我得到以下日志并跟随未知的选择器异常.该程序具有用户设置以显示和隐藏QTMovieView控制器的选项.程序链接的SDK是10.7

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

谢谢你的帮助

Raf*_*ski 6

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

也就是说,如果您无法更新到AV Foundation或无法关闭自动布局,您仍然可以通过在运行时向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);
  }
}
Run Code Online (Sandbox Code Playgroud)

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

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

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


小智 1

如果我尝试在启用 AutoLayout 的情况下使用 setMovie: ,我也会遇到同样的问题。Xcode 4.4.1 的更新修复了该问题。