我有一个 tvOS 应用程序,其中
UITabBarController
作为主故事板的主要入口点。如果用户未登录,UITabBarController
会以模态方式呈现 LoginViewController
。
当用户按下 Siri 遥控器上的菜单按钮时,系统会自动关闭
LoginViewController
并显示 UITabBarController
。我希望应用程序退出到 tvOS 床头板。
预计解决方案涉及
UITapGestureRecognizer
来覆盖菜单按钮操作,或覆盖 pressesBegan/pressesTouched
,但我还没有找到解决方案。
以下代码片段有效,并且基于 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)
}
我有一个非常相似的情况,看起来像这样:
+--------------------+
------>| 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
}
}
希望这对那里的人有帮助🙂
关于这个非常老的问题。我想指出的是
exit(EXIT_SUCCESS)
解决方案现在不起作用。
问题是,正如您将看到的,当您退出时,他们会引入 3-4 秒的延迟。在模拟器中,它可以正常工作(有 3-4 秒的延迟),但在设备上,它会明显失败,结果不稳定。
老实说,我觉得唯一的方法是“自然地”设置电视应用程序 - 基本上这样“主屏幕”确实从根本上来说是“第一个/包装器”屏幕,然后用户的后退单击确实可以完全工作自然而然。
截至 2023 年,除非我错过了某些东西 - 可能就是这种情况 - 我真诚地相信“自然”方法是处理电视应用程序的唯一方法,以便人们可以退出。
不幸的是,这似乎就是现状。