22

我在用我的 avplayer 控制 iPhone 控件时遇到问题。

如果我把函数

- (void)remoteControlReceivedWithEvent:(UIEvent *)event

在负责播放被调用函数的视图控制器中,但前提是我要在当前视图控制器中进入后台。

如果我要从其他视图控制器返回后台,则该函数永远不会调用。

这就是为什么我想把它放在应用程序委托中。

我尝试了成为第一响应并将该功能放在每个视图控制器中,但它确实有帮助。

我也打电话

[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];

在里面

-(void)applicationWillResignActive:(UIApplication *)application

谢谢

4

3 回答 3

24

我已将以下代码用于 iPhone Control -

[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
[self becomeFirstResponder];

用于注册监听遥控器。完成后删除它 -

[[UIApplication sharedApplication] endReceivingRemoteControlEvents];
[self resignFirstResponder];

使应用程序canBecomeFirstResponder -

- (BOOL)canBecomeFirstResponder {
    return YES;
}

使用委托方法来处理 iPhone 控制,例如双击主页按钮时播放和暂停

- (void)remoteControlReceivedWithEvent:(UIEvent *)event {
    //if it is a remote control event handle it correctly
    if (event.type == UIEventTypeRemoteControl) {
        if (event.subtype == UIEventSubtypeRemoteControlPlay) {
           [audioPlayer play];
            NSLog(@"play");
        } else if (event.subtype == UIEventSubtypeRemoteControlPause) {
           [audioPlayer stop];
             NSLog(@"pause");
        } else if (event.subtype == UIEventSubtypeRemoteControlTogglePlayPause) {
            NSLog(@"toggle");
        }
    }
}

就我而言,我能够处理播放和暂停。如果有任何问题,请告知。

于 2012-08-17T10:55:50.067 回答
12

您可以将函数沿响应者链向上移动到 UIApplication 子类。这样,它将始终在那里捕捉事件。

这种事件在常见的 UI 和控制器类中被忽略,因此它会传播到响应者链的底部,即您的应用程序委托和应用程序本身所在的位置。

如此处所述,UIApplication 的委托不是响应者链的一部分(我在这里错了)。UIApplication 在那里,根 UIWidow、链中的所有视图和相应的 UIViewController 也在那里。

于 2012-08-12T16:40:51.283 回答
2

提示:becomeFirstResponder必须从viewDidAppear中调用,而不是viewWillAppear...

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    [self becomeFirstResponder];
}
于 2013-08-16T09:56:04.787 回答