通过tvOS中的远程菜单按钮检测UIViewController何时被解除

时间:2015-12-07 15:16:47

标签: swift uiviewcontroller segue tvos dismiss

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

我的问题是当我按下远程菜单按钮时,第二个视图控制器模式自动解除,我发现无法在第一个视图控制器上执行操作或被通知。

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

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

3 个答案:

答案 0 :(得分:1)

我相信这是你想要完成的事情

// 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并按住Ctrl键从你的Controller图标拖动到你的Exit图标,你会看到一个下拉列表:

enter image description here

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

答案 1 :(得分:0)

第一个视图控制器:

@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 enter image description here

答案 2 :(得分:0)

这就是使用 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
}