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上添加我。