如何在Objective-C中收听Apple TV Remote?



这似乎应该非常简单,但我很难找到一个工作示例,好的文档,甚至许多有用的StackOverflow帖子。

我有一个包含 AVP layer的自定义视图,如下所示:

@implementation
{
@private
AVPlayerViewController *controller
}
- (id) init
{
self = [super init];
if (self)
{
controller = [[AVPlayerViewController alloc] init];
controller.view.frame = self.view.bounds;
[self.view addSubview:controller.view];
}
return self;
}
@end

(我还有其他一些视图,例如覆盖播放器的消息,交换视频时显示的海报等 - 但这是基本设置(

当我集成 IMA SDK 时,我开始遇到问题。如果您在广告期间按下遥控器上的暂停按钮,它会很好地暂停广告。但是,如果您再次按下暂停按钮,它不会取消暂停广告,而是取消暂停广告后面的内容播放器。我没有听到任何音频,但我知道内容播放器未暂停,因为我的视频中有 ID3 元数据,点击它时有一个NSLog()语句,我开始看到这些日志。如果我再次按下暂停按钮,日志将暂停。我第四次按下它,日志再次启动。

为了尝试解决此问题,我想将听众绑定到遥控器的播放/暂停按钮,并确保如果我正在播放广告,则广告会恢复,而不是内容。所以我尝试在我的视图上向我的init方法添加以下内容:

UITapGestureRecognizer *tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self.view action:@selector(tapped:)];
[tapRecognizer setAllowedPressTypes:@[ [NSNumber numberWithInt:UIPressTypePlayPause] ]];
[self.view addGestureRecognizer:tapRecognizer];

然后,我创建了以下方法:

- (void) tapped: (UITapGestureRecognizer *) sender
{
NSLog(@"Tapped");
}

这不是所谓的。我很有信心我犯了一个简单的错误,但文档不是很清楚,所以我不确定我应该做什么。关于检测按钮按下的官方文档使用 Swift 并说:

let tapRecognizer = UITapGestureRecognizer(target: self, action: "tapped:")
tapRecognizer.allowedPressTypes = [NSNumber(integer: UIPressType.PlayPause.rawValue)];
self.view.addGestureRecognizer(tapRecognizer)

我相信我把这三行翻译得很好。然后,文档不会显示tapped方法应该是什么样子,而是继续使用低级事件处理。因此,为了获得适当的方法签名,我查看了UITagGestureRecognizer上的文档,其中包含以下(Swift(示例来编写处理程序:

func handleTap(sender: UITapGestureRecognizer) {
if sender.state == .ended {
// handling code
}
}

这就是我和- (void) tapped: (UITapGestureRecognizer *) sender一起去的原因

尽管如此,在所有这些之后,它不起作用。

快速更新

我尝试替换:

initWithTarget:self.view

跟:

initWithTarget:controller.view

和:

self.view addGestureRecognizer

跟:

controller.view addGestureRecognizer

这一次,当我按下播放/暂停按钮时,看起来确实发生了一些事情。应用程序崩溃,Xcode给了我以下错误:

2019-12-17 12:16:50.937007-0500 Example tvOS App[381:48776] -[_AVPlayerViewControllerContainerView tapped:]: unrecognized selector sent to instance 0x10194e060

所以看起来(如果我错了,请纠正我(:

  • AVPlayerViewController 有焦点,而不是我的观点
  • 手势识别器在注册到的任何类上调用选择器
  • ,而不是在进行注册的类上调用选择器

所以我想我原来的问题是:我如何允许我的类处理其他类(例如AVPlayerViewController(上的手势?

目标不需要等于手势识别器附加到的视图。您可以将目标设置为MyView但仍将手势识别器附加到controller.view

若要解决unrecognized selector崩溃问题,需要确保提供正确的对象作为手势识别器的targetUIGestureRecognizer的工作方式是,当手势被识别时,它将在给定的target对象上调用给定的selector。换句话说,当手势触发时,它将执行等效的

[target selector:self];

(您似乎将target视为手势将附加到的视图,这不是它的工作原理(

因此,如果您在类MyView上实现了tapped:,则传递给手势识别器初始值设定项的target应该是MyView的实例。您可能希望提供self,而不是self.view

最新更新