【问题标题】:xcode tvos app exiting issue when overriding menu button覆盖菜单按钮时xcode tvos应用程序退出问题
【发布时间】:2016-01-03 16:37:30
【问题描述】:

我目前正在编写一个 tvOS 应用程序。我一直在使用 tapRecognizer 检测并覆盖菜单按钮,以在故事板和其他功能之间切换。我的问题是当我在主屏幕上按菜单时它不会退出应用程序。相反,它会记住我在覆盖菜单按钮并执行该功能时使用的最后一个功能。关于如何清除 tapRecognizer 的任何想法?还是会退出应用的函数?

我正在用

覆盖菜单按钮

在故事板 1 中

tapRecognizer = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(home)];
tapRecognizer.allowedPressTypes = @[[NSNumber numberWithInteger:UIPressTypeMenu]];
[self.view addGestureRecognizer:tapRecognizer];

在我的 home 子程序中,我将用户发送回我的主页故事板。但从那时起,菜单按钮将不会退出应用程序,而是将我送回 storyboard1。 谢谢, 西南

【问题讨论】:

标签: xcode menu tvos


【解决方案1】:

不要使用您自己的手势识别器,而是覆盖 pressesBegan:

override func pressesBegan(presses: Set<UIPress>, withEvent event: UIPressesEvent?) {
  if(presses.first?.type == UIPressType.Menu) {
    // handle event
  } else {
    // perform default action (in your case, exit)
    super.pressesBegan(presses, withEvent: event)
  }
}

【讨论】:

  • 感谢您向我展示此方法。我是不是这个代码?在 viewdidload 中?
  • 该方法应该添加到你的 UIViewController
  • 谢谢!这是否意味着将它添加到我的 .m 文件或 @implementation ViewController{ } 中的任何位置?
  • 在改变场景或摆脱手势时你需要这样的东西
  • 我正在开发 Apple TV 应用程序。这个应用程序是基于播放视频。我的要求是当用户暂停视频并按下菜单按钮时,视频会连续播放。我希望在视频暂停状态下,用户按下菜单按钮,然后屏幕重定向到前一个屏幕而不播放视频。
【解决方案2】:

如果您使用UIGestureRecognizer 而不是响应按下,您需要做的就是禁用识别器:

tapRecognizer.enabled = NO;

因此,如果没有带有UIPressTypeMenu 的识别器在监听,tvOS 会暂停应用并显示主屏幕。 (我已经测试过了)

【讨论】:

    【解决方案3】:

    您必须重写 2 种方法以防止按菜单按钮退出应用程序。

    这是现成的模板:

    override func pressesBegan(presses: Set<UIPress>, withEvent event: UIPressesEvent?) {
        for press in presses {
            switch press.type {
            case .Menu:
                break
            default:
                super.pressesBegan(presses, withEvent: event)
            }
        }
    }
    
    override func pressesEnded(presses: Set<UIPress>, withEvent event: UIPressesEvent?) {
        for press in presses {
            switch press.type {
            case .Menu:
                //Do some staff there!
                self.menuButtonPressed()
            default:
                super.pressesEnded(presses, withEvent: event)
            }
        }
    }
    

    【讨论】:

      【解决方案4】:

      如果您覆盖菜单按钮,应用程序将不会被接受:

      编辑:您可以覆盖,但菜单按钮必须作为从应用程序入口点返回主屏幕的后退按钮。

      10.1 详情

      Siri Remote 上的菜单按钮在您的 应用程序。

      具体来说,当用户启动应用并点击菜单按钮时 在 Siri 遥控器上,应用程序不会退出到 Apple TV 主屏幕。

      下一步

      请修改您的应用程序以确保 Siri 远程按钮的行为正常 符合预期并遵守 Apple TV 人机界面指南。

      【讨论】:

      • 这是真的吗?我知道一些应用程序在您按下菜单按钮时不会退出。如果它位于应用程序的入口点,即它自己的主屏幕,我认为它退出到主屏幕是有意义的。但是我见过像 Hungry Shark Evolution 这样的应用程序在按下菜单按钮时不会退出。在该游戏中,它更多地用作返回按钮。但即使在主菜单上,它也不会返回 Apple TV 主屏幕
      • 是的,你是对的。但是在 entry-ViewController 上它必须返回主屏幕,所以只有在必要时才覆盖它。
      • 我需要知道如何有条件地处理按钮按下。换句话说,我如何以编程方式退出到主屏幕(最好不要杀死应用程序)?
      【解决方案5】:

      也许对你有帮助... 这是快速代码。

      let menuPressRecognizer = UITapGestureRecognizer()
      menuPressRecognizer.addTarget(self, action: #selector(YourViewController.menuButtonAction(_:)))
      menuPressRecognizer.allowedPressTypes = [NSNumber(integer: UIPressType.Menu.hashValue)]
      self.view.addGestureRecognizer(menuPressRecognizer)
      

      【讨论】:

        【解决方案6】:

        根据 Apple 的文档,对于自定义新闻处理,我们应该覆盖所有这四个方法-

        - (void)pressesBegan:(NSSet<UIPress *> *)presses withEvent:(nullable UIPressesEvent *)event NS_AVAILABLE_IOS(9_0);
        - (void)pressesChanged:(NSSet<UIPress *> *)presses withEvent:(nullable UIPressesEvent *)event NS_AVAILABLE_IOS(9_0);
        - (void)pressesEnded:(NSSet<UIPress *> *)presses withEvent:(nullable UIPressesEvent *)event NS_AVAILABLE_IOS(9_0);
        - (void)pressesCancelled:(NSSet<UIPress *> *)presses withEvent:(nullable UIPressesEvent *)event NS_AVAILABLE_IOS(9_0);
        

        这是来自 XCode 的官方文档:

        一般来说,所有进行自定义新闻处理的响应者都应该 覆盖所有这四个方法。

        您的响应者将收到 pressesEnded:withEvent 或 pressesCancelled:withEvent: for each

        按下它正在处理(它在 pressesBegan:withEvent: 中收到的那些按下)。

        pressesChanged:withEvent: 将为提供 模拟值 (如拇指摇杆或模拟按钮)

        *** 您必须处理取消的印刷机以确保正确的行为 你的申请。未能 这样做很可能导致不正确的行为或崩溃。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-03-02
          • 1970-01-01
          • 2016-04-03
          • 1970-01-01
          • 2013-06-04
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多