我是TVOS的初学者。
我想使用原生应用和TVMLKIT在AppleTV上创建混合应用。 我的原生应用程序只是一个带按钮的简单本机应用程序(使用swift)。
当我们点击按钮时,我使用TVLMKIT和TVJS启动了一个javascript应用程序。
我的TVJS使用播放器显示视频。 当视频结束时,我想关闭TVJS应用程序并返回本机ViewController。
我的问题是,当我回到本机应用程序时,我将焦点放在我的原生视图上(应用程序被冻结)。
原生ViewController:
import UIKit
import TVMLKit
class ViewController: UIViewController, TVApplicationControllerDelegate {
var window: UIWindow?
var appController: TVApplicationController?
var appControllerContext = TVApplicationControllerContext();
static let TVBaseURL = "http://localhost:9001/"
static let TVBootURL = "\(ViewController.TVBaseURL)/client/js/application.js"
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
@IBOutlet weak var label: UILabel!
@IBOutlet weak var viewAd: UIView!
@IBAction func clickOnlaunchAd(sender: AnyObject) {
window = UIWindow(frame: UIScreen.mainScreen().bounds)
guard let javaScriptURL = NSURL(string: ViewController.TVBootURL) else {
fatalError("unable to create NSURL")
}
appControllerContext.javaScriptApplicationURL = javaScriptURL
appControllerContext.launchOptions["BASEURL"] = ViewController.TVBaseURL
appController = TVApplicationController(context: appControllerContext, window: window,delegate: self)
}
@IBAction func clickOnChangeText(sender: AnyObject) {
label.text = "changed";
}
func appController(appController: TVApplicationController, didStopWithOptions options: [String : AnyObject]?) {
self.setNeedsFocusUpdate()
self.updateFocusIfNeeded()
}
func appController(appController: TVApplicationController, evaluateAppJavaScriptInContext jsContext: JSContext){
let notifyEventToNative : @convention(block) (NSString!) -> Void = {
(string : NSString!) -> Void in
print("[log]: \(string)\n")
self.appController?.stop()
}
jsContext.setObject(unsafeBitCast(notifyEventToNative, AnyObject.self), forKeyedSubscript: "notifyEventToNative")
}
}
在从我的TVJS调用“notifyEventToNative”之前,我称之为“navigationDocument.clear();”清除TVML视图。
我可以看到我的原生应用,但我无法与之互动。
有什么想法吗? 感谢。
答案 0 :(得分:0)
我也有同样的问题。我从UIViewController打开了一个TVML文档。而且我也失去了焦点。所以,首先我建议你在ViewController中覆盖名为preferredFocusedView的var。在此方法中,您可以返回对viewAd的引用。但更好的解决方案是将ViewController包装到TVML项目中(使用TVMLKit框架)。在这种情况下,我希望你没有焦点问题,因为你将在整个应用程序中使用TVML。