TVML和UIKit作为快乐的室友
每个tvOS教程都有一个经典的开始,这是一个问题:您要创建TVKit应用程序还是本机UIKit应用程序?
根据该问题的答案,您将获得两种完全不同的创建应用程序的方法之一。
关键是该问题的答案通常不是那么容易,因为实际上,TVKit或UIKit两种选择都有其优点和缺点。
📺TVKit :是快速原型制作的绝佳解决方案。 Apple提供了一套非常漂亮的TVML模板 ,因此只需几行代码,您就可以得到外观精美,与系统完全集成的应用程序。 另一方面,TVML模板基本上就像它们一样,并且确实提供了相当低的自定义级别。
💄UIKit :另一方面,提供了更高级别的定制。 但是它缺少那些精美的模板,因此您需要手动创建所有所需内容。
如果我们可以将它们混合起来,那不是很好吗? 因此,我们可以同时拥有一个非常可定制的App,并可以选择使用TVML快速制作特定部分的原型吗?
分离式TVML:
开始使用TVML的必要步骤之一是设置TVApplicationController的实例。 TVApplicationController的这一实例将使我们能够将应用程序的控件发送给JS。
通常,TVML Apps直接在其AppDelegate中创建其TVApplicationController实例,这基本上就是它们具有的所有快速代码:
如您所见,TVApplicationController的构造函数接收的参数之一是应用程序窗口。
关键是,当将该窗口参数设置为我们的TVApplicationController时,它将实际上将应用程序的rootViewController设置为我们的TVKit代码定义的那个。
但是,如果那时我们不将TVApplicationController的实例绑定到窗口,而是使用nil
代替window参数,该怎么办?
然后,我们将获得未绑定到窗口的TVApplicationController的分离实例。 还要感谢TVApplicationController
公开的属性navigationController
,它只是一个标准的UINavigationController,我们可以根据需要手动托管它。
这是一个非常简单的示例,当触发IBAction sendMeToTVMLButtonWasPressed
时,UIKit ViewController呈现TVKit屏幕:
就是这样,通过这种简单的方法,我们可以在同一App中使用UIKit和TVKit,并在它们适合时使用它们中的一个。
TVML作为UIViewController:
注意到使用UIKit或TVKit实现视图只是实现细节这一事实,如果我们能够摆脱那些具有相似接口的特殊性,那不是很好吗?
实际上,这就是我们可以将TVKit代码嵌入UIKit容器视图中的内容,因此它通过UIViewController的界面公开。
给我看代码:
如果您对此感兴趣,请准备一个结合了UIKit和TVKit的简单项目,将TVML屏幕嵌入UIKit ViewController中,以便像其他任何ViewController一样呈现。
让tvmlViewController = TVMLViewController() 存在(tvmlViewController,动画:true,完成:nil)
只是为了好玩……我还向TVKit屏幕添加了一些JS,并将其与Swift中的一些异步代码绑定以模拟一些网络通信。
结论:
UIKit很棒,自那以后一直存在,一直为我们提供许多强大和灵活的功能,但是无论您是否喜欢,Apple都在TVKit和这种新的工作方式上投入了大量资金。
最好的部分是TVKit和UIKit绝对不是排他性的,我们可以在需要它们时利用它们各自的优点进行混合。
如有任何疑问,请随时在github , twitter或dcordero.me上添加我。