在呈现的模态视图控制器上按下时允许菜单按钮退出 tvOS 应用程序

问题描述 投票:0回答:3

我有一个 tvOS 应用程序,其中

UITabBarController
作为主故事板的主要入口点。如果用户未登录,
UITabBarController
会以模态方式呈现
LoginViewController

当用户按下 Siri 遥控器上的菜单按钮时,系统会自动关闭

LoginViewController
并显示
UITabBarController
。我希望应用程序退出到 tvOS 床头板。

预计解决方案涉及

UITapGestureRecognizer
来覆盖菜单按钮操作,或覆盖
pressesBegan/pressesTouched
,但我还没有找到解决方案。

storyboard tvos siri-remote
3个回答
5
投票

以下代码片段有效,并且基于 Apple 中菜单按钮的预期行为是可接受的行为用于远程和交互的 HIG

override func viewDidLoad() {
    super.viewDidLoad()

    let tapRecognizer = UITapGestureRecognizer(target: self, action: "tapped")
    tapRecognizer.allowedPressTypes = [NSNumber(integer: UIPressType.Menu.rawValue)];
    self.view.addGestureRecognizer(tapRecognizer)
}

func tapped() {
    exit(EXIT_SUCCESS)
}

2020 年代语法:https://stackoverflow.com/a/68052750/294884


3
投票

我有一个非常相似的情况,看起来像这样:

               +--------------------+
        ------>| MainViewController |
               +--------------------+
                         |
           +-------------+-------------+
           |                           |
           v                           v
+---------------------+      +--------------------+
| LoginViewController |      | HomeViewController |
+---------------------+      +--------------------+

如果出现

LoginViewController
HomeViewController
,那么我希望菜单按钮关闭应用程序并返回电视主屏幕,不是
MainViewController

经过多次谷歌搜索后,我选择了这个解决方案,它似乎运行良好,不会触发警告或需要调用

exit

class MainViewController: UIViewController {
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        super.prepare(for: segue, sender: sender)
        UIApplication.shared.keyWindow?.rootViewController = segue.destination
    }
}

希望这对那里的人有帮助🙂


0
投票

2023 年...

关于这个非常老的问题。我想指出的是

exit(EXIT_SUCCESS)

解决方案现在不起作用

问题是,正如您将看到的,当您退出时,他们会引入 3-4 秒的延迟。在模拟器中,它可以正常工作(有 3-4 秒的延迟),但在设备上,它会明显失败,结果不稳定。

老实说,我觉得唯一的方法是“自然地”设置电视应用程序 - 基本上这样“主屏幕”确实从根本上来说是“第一个/包装器”屏幕,然后用户的后退单击确实可以完全工作自然而然。

截至 2023 年,除非我错过了某些东西 - 可能就是这种情况 - 我真诚地相信“自然”方法是处理电视应用程序的唯一方法,以便人们可以退出。

不幸的是,这似乎就是现状。

© www.soinside.com 2019 - 2024. All rights reserved.