【问题标题】:remoteControlReceivedWithEvent not Called in appDelegate未在 appDelegate 中调用 remoteControlReceivedWithEvent
【发布时间】:2016-02-22 22:50:19
【问题描述】:

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

如果我放函数

- (void)remoteControlReceivedWithEvent:(UIEvent *)event

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

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

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

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

我也叫

[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];

-(void)applicationWillResignActive:(UIApplication *)application

谢谢

【问题讨论】:

    标签: iphone ios


    【解决方案1】:

    我已将以下代码用于 iPhone 控制 -

    [[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");
            }
        }
    }
    

    在我的情况下,我能够处理播放和暂停。如果有任何问题,请告知。

    【讨论】:

    • 没有检查 iOS 6+ ,将检查。
    • 对不起,从那天起我没有测试过。但我想它会工作的。
    • 伙计们,这是可行的。只是不要忘记覆盖 - (BOOL)canBecomeFirstResponder {} 方法
    • 嘿桑迪,我按照指示做了。在 viewDidAppear() 中添加了 becomeFirstResponder,在 viewDidDisappear() 中添加了 resignFirstResponder。此外,实现了 canBecomeFirstResponder 方法。但是,当我按下 UI 上的任何按钮时,我没有在 remoteControlReceivedWithEvent 中收到任何事件,即没有调用该方法。关于我可能遗漏的任何指示?
    【解决方案2】:

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

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

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

    【讨论】:

    • 我尝试将功能添加到应用程序委托中,但运气不佳。最后我创建了一个 uiwindow 的子类并在那里实现了函数
    • @iYaniv 继承 UIApplication 来捕获此类事件是一个更好的主意。你可以有多个窗口:)
    【解决方案3】:

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

    - (void)viewDidAppear:(BOOL)animated
    {
        [super viewDidAppear:animated];
        [self becomeFirstResponder];
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-14
      • 1970-01-01
      • 2012-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-17
      • 1970-01-01
      相关资源
      最近更新 更多