Xcode在覆盖菜单按钮时退出tvOS应用程序的问题

11

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

我正在Storyboard1中覆盖菜单按钮。

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

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


这是我的代码,对我来说运行良好。请尝试访问此链接:https://dev59.com/qZzha4cB1Zd3GeqPGovY#41426885 - anas.p
7个回答

16

不要使用自己的手势识别器,重写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中吗? - Swick
该方法应该添加到您的UIViewController中。 - ehynds
谢谢!这是指将其添加到我的.m文件中的任何位置还是在@implementation ViewController{ }中? - Swick
当切换场景或取消手势时,您需要类似这样的东西。 - crashoverride777
我正在开发Apple TV应用程序。该应用程序基于视频播放。我的要求是,当用户暂停视频并按下菜单按钮时,视频应继续播放。我希望在视频暂停状态下,用户按下菜单按钮后,屏幕会重定向到以前的屏幕,而不会播放视频。 - Sankalap Yaduraj Singh

5

要防止按下菜单按钮退出应用程序,您需要覆盖两种方法。

这是可直接使用的模板:

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
如果您正在使用UIGestureRecognizer而不是响应按下操作,您需要做的就是禁用识别器:disable the recognizer
tapRecognizer.enabled = NO;

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


2
如果您覆盖菜单按钮,应用程序将不被接受:
编辑:您可以进行覆盖,但是菜单按钮必须作为从应用程序入口返回主屏幕的返回按钮。
10.1详细信息
Siri遥控器上的菜单按钮在您的应用程序中无法按预期工作。
具体来说,当用户启动应用程序并点击Siri遥控器上的菜单按钮时,应用程序不会退出到Apple TV主屏幕。
下一步操作
请修改您的应用程序,以确保Siri遥控器按钮按预期工作,并符合Apple TV人机界面指南。

这是真的吗?我知道有一些应用程序在按下菜单按钮时不会退出。我认为如果它在应用程序的入口点,即自己的主屏幕上,将其退出到主屏幕是有道理的。但是,我见过像饥饿鲨鱼进化这样的应用程序,在按下菜单按钮时并不会退出。在该游戏中,它更像是一个返回按钮。但即使在主菜单上,它也不会退出返回到Apple TV主屏幕。 - prototypical
是的,你说得对。但在 entry-ViewController 上,它必须返回到主屏幕,所以只有在必要的情况下才覆盖它。 - matthiaswitt
我需要知道如何有条件地处理按钮按下事件。换句话说,我如何在程序中编程地退出到主屏幕(最好不要关闭应用程序)? - livingtech

0

它可能会对你有所帮助... 这是 Swift 代码。

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

0

SwiftUI 搜寻者:

我不知道这个答案有多大帮助,但在SwiftUI中添加可用的操作。

YourAnyView
  .onExitCommand(perform: {
      print("onExitCommand")
  })
  .onMoveCommand { direction in
      print("onMoveCommand", direction)
  }

参考:

onmovecommand

onexitcommand


0
根据苹果的文档,在自定义按压处理方面,我们应该覆盖这四个方法 -
- (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的官方文档:

通常,所有进行自定义按压处理的响应者都应该覆盖这四个方法。

您的响应者将为其处理的每个按压(在pressesBegan:withEvent:中接收到的那些按压)接收pressesEnded:withEvent或pressesCancelled:withEvent:

对于提供模拟值的按压(如拇指杆或模拟推按钮),将调用pressesChanged:withEvent:

*** 您必须处理取消的按压以确保应用程序的正确行为。不这样做很可能会导致不正确的行为或崩溃。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接