检测 UIViewController 何时被 tvOS 中的遥控器菜单按钮关闭

Detect when a UIViewController has been dismissed by the remote's menu button in tvOS

我正在开发 Apple TV 应用程序 (tvOS),其中 第一个视图控制器 打开 第二个视图controller 通过 segue。当我在第二个视图控制器上选择一个选项时,它会在第一个视图控制器上执行展开操作。

我的问题是当我按下 远程菜单按钮 时, 第二个视图控制器模态自动关闭 并且我找不到执行的方法对第一个视图控制器的操作或被通知。

如何检测通过 segue 打开的控制器何时被 遥控器的菜单按钮 关闭?

┌─────────────┐               ┌─────────────┐   
│ First View  │    ┌─────┐    │ Modal View  ├──┐
│ Controller  ├────┤segue├────▶ Controller  │  │
└─────────────┘    └─────┘    └─────────────┘  │
                ┌────────────┐      ┌───────┐  │
                │ Modal Auto │      │ Menu  │  │
  Action ??  ◀──┤  Dismiss   ◀──────│Button │◀─┘
                └────────────┘      └───────┘   

我相信这就是您要实现的目标

// Put this in your FirstViewController
@IBAction func returnToFirstViewController(segue:UIStoryboardSegue) {
  print("This is called after  modal is dismissed by menu button on Siri Remote")
}

// Put this in your SecondViewController
override func viewDidLoad() {
  super.viewDidLoad()  

  // Do any additional setup after loading the view.

  let tapRecognizer = UITapGestureRecognizer(target: self, action: Selector("handleMenuPress:"))
  tapRecognizer.allowedPressTypes = [UIPressType.Menu.rawValue]
  view.addGestureRecognizer(tapRecognizer)
}

func handleMenuPress(recognizer: UITapGestureRecognizer) {
  self.performSegueWithIdentifier("YourUnwindSegueIdentifier", sender: nil)
}

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
  if segue.identifier == "YourUnwindSegueIdentifier" {
     // do any cleanup activities here if you need
  }
}

现在你必须建立一些故事板连接。进入你的 SecondViewController 并从你的 Controller 图标按住 ctrl 拖动到你的 Exit 图标,你会看到一个像这样的下拉菜单:

Select 连接它的方法,然后您将在故事板的 SecondViewController 中看到一个 Unwind Segue。为该 segue 提供 "YourUnwindSegueIdentifier" 的标识符名称(因此我的示例代码将起作用 - 或者使用您想要的任何名称)。构建并 运行,这应该可以满足您的需求。

第一个视图控制器:

@IBAction func modalDismissed(segue: UIStoryboardSegue) {
    print("Modal dismissed")
}

模态视图控制器:

override func pressesBegan(presses: Set<UIPress>, withEvent event: UIPressesEvent?) {
    for item in presses {
        if item.type == .Menu {
            self.performSegueWithIdentifier("dismissModal", sender: nil)
        }
    }
    super.pressesBegan(presses, withEvent: event)
}

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if segue.identifier == "dismissModal" {
        print("Modal Dismiss")
    }
}

在名为 "dismissModal" 的模态视图控制器上创建 退出 segue

这对我有用 Swift 5:

private func setupRemoteGesture() {
    let tapRecognizer = UITapGestureRecognizer(target: self, action: #selector(handleMenuPress))
    tapRecognizer.allowedPressTypes = [NSNumber(value: UIPress.PressType.menu.rawValue)]
    view.addGestureRecognizer(tapRecognizer)
}

@objc private func handleMenuPress() {
    // Menu button pressed
}