如何更改“菜单”按钮的行为以不终止应用

时间:2019-09-05 12:44:11

标签: tvos swiftui

刚开始时:我不想从Apple的用户体验指南中更改用户体验,实际上我想将其重新带回我的App,所以这就是问题所在:

“菜单”按钮应在导航层次结构中返回上一级,如果不再存在该级别,则终止该应用。

我的第一个导航屏幕还具有最初隐藏的全屏视图(例如视频播放器)。从第一个导航屏幕,用户可以进入更深层次。 “菜单”按钮具有正确的标准行为。

然后,最深的导航级别将显示隐藏的全屏视图。当用户按下“ MENU”时,导航应返回到上一级,但它将终止该应用程序。

如何仅为此单个视图更改“菜单”按钮的行为?

2 个答案:

答案 0 :(得分:0)

实际上导致您的应用退出的原因是,按下菜单按钮的pressesEnded:withEvent:使其一直沿着响应者链上升到UIApplication。因此,如果您阻止这种情况的发生,该应用将不会退出。

有两种方法可以执行此操作:响应者链中的某人需要重写该方法并 not 调用super,或者响应者链中的某人需要具有手势识别器可以识别该按钮按下。

例如,

UINavigationController使用后者。如果导航堆栈位于其根部,则它也将禁用手势。这样,尝试弹出最后一个视图控制器实际上会退出应用程序。

答案 1 :(得分:0)

实现这一点并不困难。只需确保向用户显示的初始屏幕不是根视图。

我将堆栈放在这里。 根视图包含两个视图,即

  1. VideoContainerView和

  2. MainContainerView。

VideoContainerView将具有UIViewController,该UIViewController具有menuHandler按钮侦听器。此VC在按下按钮时会在RootView顶部显示另一个视图。

MainContainerView将具有UIViewController,该UIViewController没有任何menuHandler。 MainContainerView显示在VideoContainerView的顶部。

堆栈

MainContainerView(顶部)

VideoContainerView

RootViewController

RootView-> VideoContainerView(一个包含VideoScreenController的视图) RootView-> MainContainerView(包含MainViewController的视图)

RootView-> VideoContainerView-> VideoScreen(初始屏幕,请确保这是使用ContainerView在该FirstView顶部显示的View Controller)。

在VideoScreenController中,按 Menu按钮 ,将显示RootView的MainContainerView,该MainContainerView一直隐藏到该VideoContainerView的顶部。

在按“下一步菜单”按钮时,该应用程序将进入后台,因为MainViewController不处理任何菜单按按钮。

从不听RootView顶视图上的任何MenuButton按下。

使用,可以轻松控制首选的焦点流,

override var preferredFocusEnvironments: [UIFocusEnvironment] {
   if topView.isHidden {
      return [VideoContainerView]
   } else {
      return [MainContainerView]
   }

}

明智地,在每个ViewController中都具有preferredFocusEnvironments来处理初始的首选Focus,以便系统知道当前焦点在哪个。

上面的代码可以帮助系统知道哪个视图应该集中在启动或每个焦点更改上。