当覆盖菜单按钮时,xcode tvos app退出问题

时间:2015-10-06 16:52:34

标签: xcode menu tvos

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

我用

覆盖了菜单按钮 在Storyboard1中

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

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

6 个答案:

答案 0 :(得分:13)

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

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)
  }
}

答案 1 :(得分: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)
        }
    }
}

答案 2 :(得分:2)

如果您覆盖菜单按钮,则不会接受该应用:

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

  

10.1详细信息

     

Siri遥控器上的菜单按钮在您的操作中表现不尽如人意   应用

     

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

     下一步      

请修改您的应用以确保Siri遥控器按钮的行为   符合预期并符合Apple TV人机界面指南。

答案 3 :(得分:1)

如果您使用的是UIGestureRecognizer而不是回复按下,那么您需要做的就是禁用识别器:

tapRecognizer.enabled = NO;

因此,如果没有UIPressTypeMenu的识别器正在侦听,则tvOS会暂停该应用并显示主屏幕。 (我已经测试了这个)

答案 4 :(得分:0)

它可能对你有所帮助...... 这是快速的代码。

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

答案 5 :(得分:0)

根据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:

     

正在处理的印刷机(那些在pressesBegan:withEvent:中接收到的印刷机)。

     

pressesChanged:withEvent:将为提供以下内容的印刷机调用   模拟值   (如指尖或模拟按钮)

     

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