WatchKit编程指南:Interface Object–界面对象

1418720197791879

你可以使用界面对象(Interface Object)来操作WatchKit app的UI。界面对象指的是WKInterfaceObject类的实例,或者更具体点说是其子类的实例。WatchKit框架为绝大部分(但不是全部)视觉元素提供了界面对象,您可以将其添加给您的UI。界面对象并非视图,它们是与真实视图进行无线通讯的代理对象(proxy objects),用以实现Apple Watch上的UI。

注意:Apple Watch上界面对象与对应的视图之间的通信有单向性,即信息流是从WatchKit扩展传到Apple Watch的。换句话说,你可以对界面对象的某些属性值进行更改设置,但你无法获得其属性的当前值。在对设备状态进行更改的时候从Apple Watch上获取数据对性能和延迟均有影响。因此我们推荐你在自己的WatchKit扩展中保存你对界面的配置信息。

创建界面对象

通过在界面控制器中添加已声明的属性并将其与Storyboard文件中对应元素连接就可以间接地创建界面对象,无需自己申请内存或者初始化界面对象。在初始化界面控制器对象过程中,WatchKit会为任何已连接的outlet自动创建界面对象。

当为界面对象添加已声明属性时,需将该类设置为合适的类型,并在声明中包含IBOutlet关键字。例如,下面是一个标签的声明:

在界面控制器中将已声明属性连接到Storyboard中相应的项目上。想要快速地创建属性声明并将其连接到Storyboard中的项目,可使用Xcode的辅助编辑器(Assistant editor)。将其从Storyboard里面通过ctrl+拖拽至界面控制器的源文件中。接着Xcode会提醒你为该outlet命名,之后它会在类中添加该outlet的声明并创建连接。

在设计阶段配置界面

在设计阶段,可以使用Xcode配置Storyboard中视觉元素的外观。对于很多与布局相关的属性,design-time是您可以配置属性的唯一机会了。比如,你可以使用一个WKInterfaceLabel对象来更改标签的文本、颜色以及字体,不过却不能更改它的行数或者是行高。这些属性必须在Xcode中配置,如下图:

1418110658567129

了解更多有关如何配置界面对象的信息,可参考WatchKit框架介绍中相关的类型描述。

在运行时更改界面

 

在WatchKit扩展的代码中,你可以依靠调用任何引用的界面对象的方法来更新应用程序UI。界面控制器只有在激活状态下才能改变界面对象的配置,当然也就包括初始化的时候。在initWithContext:以及willActivate方法中,可以调用方法来为标签、图像以及其他用户界面中的对象赋值。您也可以从界面控制器的动作方法中更新应用程序UI。

在初始化阶段,请确保WatchKit在做其他事情之前先初始化interface controller class. 通过WKInterfaceController及其子类的初始化方法,WatchKit可以为app创建界面对象。所以您为界面控制器编写的任何初始化代码都必须首先调用父类的实现,如下Listing 7-1示例:

Listing 7-1 使用Swift初始化一个interface controller

Listing 7-2 使用Objective-C初始化一个interface controller

为了提高性能和延长电池寿命,WatchKit框架优化了在app界面对象上设置数值的任何试图。只要在同一的Run Loop中,无论你何时为一个或者多个界面对象设置值,这些值都会被打包传给Apple Watch并作为单个批处理以提高效率。合并这些改变意味着对象的既有属性只有最后一次更改被发送给设备。更为重要的是,如果为同样的属性设置了相同的值,那么会生一条日志信息,以便你跟踪重复调用。

关于配置界面对象的更多信息,请参看WatchKit Framework Reference中相应的类说明。

响应用户交互

请使用按钮、开关以及其他的交互控件来更改应用状态。当点击按钮或某一控件的值发生变化时,WatchKit会调用界面控制器中相关的动作方法(action method)。每种界面对象针对其动作方法都有一个必须的格式,如下图所示,可以更改动作方法的名称以匹配您的应用程序:

031.jpg

当您的界面控制器初始化并显示出来之后,WatchKit就可以调用它的动作方法了,当然仅在用户与相应的控件交互时。如果您希望在没有用户交互的情况下更新用户界面,那必须配置一个NSTimer对象来安排这个任务。

这些任务可能会耗费一到两秒的时间,可以考虑将其交由父级应用(parent iOS app)来执行。像网络连接以及定位这些需要较长运行时间的任务最好由父级应用执行,然后通过一个共享的群组容器目录将信息传回WatchKit扩展。关于将任务切换给parent app来执行的更多信息,请参看Communicating Directly with Your Containing iOS App.

隐藏界面对象

通过隐藏对象你可以使用相同的界面控制器来显示不同类型的内容。Storyboard文件中的每个场景都必须包含所有运行时需要展示其内容的界面对象。如果你要根据有效数据来自定义界面,那可以将不需要的对象隐藏起来。隐藏一个对象可有效地将其从界面中移除。在设计布局时,隐藏起某些项目就可以当做是将其从布局中完全删除。如果要隐藏某个对象,只需要调用setHidden:方法并为其传递YES值就行了。

收藏 评论

相关文章

可能感兴趣的话题



直接登录
跳到底部
返回顶部