tvOS - 检测 TVML 何时从我的 UIViewController 中解除

tvOS - Detect when TVML is dismissed from my UIViewController

我的应用程序有一个视图控制器,它以模态方式调用另一个视图控制器以用模糊效果覆盖屏幕。在另一个视图控制器中,我正在显示 TVApplicationController 以在这个模糊视图之上显示具有透明背景的 TVML 内容。

let appControllerContext = TVApplicationControllerContext()

guard let javaScriptURL = NSURL(string: AppDelegate.TVBootURL) else {
    fatalError("unable to create NSURL")
}
appControllerContext.javaScriptApplicationURL = javaScriptURL
appControllerContext.launchOptions["BASEURL"] = AppDelegate.TVBaseURL

appController = TVApplicationController(context: appControllerContext, window: nil, delegate: self)

appController?.navigationController.modalPresentationStyle = UIModalPresentationStyle.OverFullScreen

self.presentViewController((appController?.navigationController)!, animated: true, completion: nil)

我想要做的是,当我按下 MENU 按钮时,让 TVML 内容消失并关闭我的模态模糊视图控制器。问题是我无法检测到 TVML 内容的 "dismissal",因此我可以关闭模​​态视图控制器。

我尝试使用 TVApplicationControllerDelegate 来接收使用它时可能会收到的消息,但没有任何帮助。

我刚刚找到了解决方法。我创建了一个像这样的小 class:

import UIKit

class HiddenView: UIView {

    override func canBecomeFocused() -> Bool {
        return true;
    }
}

然后,我所做的是在模糊视图控制器的 ViewDidLoad 上创建此 HiddenView 的实例,并将其添加到视图控制器的视图中。

let hiddenView = HiddenView(frame: CGRectMake(0,0,10,10))
self.view.addSubview(hiddenView)
// it won't appear on the screen since it has no color/text/etc

现在,当我按下遥控器上的 MENU 按钮时,当 TVML 内容被关闭时,我的模糊模式视图控制器上的委托方法 didUpdateFocusInContext 被调用,所以我可以这样关闭它:

override func didUpdateFocusInContext(context: UIFocusUpdateContext, withAnimationCoordinator coordinator: UIFocusAnimationCoordinator) {
    self.dismissViewControllerAnimated(true, completion: nil)
}

如果有人知道比必须执行此解决方法更好的方法来处理此问题,那将是很高兴知道的。