watchOS 2教程(二):表格

2024-01-07 05:08
文章标签 教程 表格 watchos

本文主要是介绍watchOS 2教程(二):表格,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1447919877672278.png

本文是投稿文章,译者:Swift_波(简书
原文:watchOS 2 Tutorial Part 2: Tables

欢迎回到 watchOS 2 系列教程!

在第一部分,你通过开发第一个界面控制器,学习了 watchOS 2 开发的基础知识。

在教程的第二部分,会向你的 app 添加一个 table 来展示航班列表。

在这个过程中,你会学到:

  • 如何添加一个新的界面控制器,往控制器中添加一个 table,并且设计原型行。

  • 如何创建 WKInterfaceController 的子类来填充这个列表,配置每一行的数据,并且处理选中事件;

  • 如何模态呈现界面控制器和向它传递数据来显示。

介绍了这些,让我们正式开始吧!

开始

打开 Watch\Interface.storyboard,从对象库中拖动另一个界面控制器到 storyboard 画板中,放在已经存在的航班控制器的左边。

选中新的界面控制器,打开属性检查器然后做如下修改:

  • 设置 Identifier 为 Schedule;

  • 设置 Title 为 Air Aber;

  • 勾选 Is Inital Controller;

  • 勾选 Display Activity Indicator When Loading

你会注意到截图的标题是深灰色的,而不是充满活力的粉红色。让我们解决它。

1.png

打开文件检查器然后改变 Globla Tint 为 #FA114F。现在看起来更好一点了:

2.png

下一步,从对象库中拖动一个 Table 到这个新的界面控制器中:

3.png

在文本大纲中选中 Table Row Controller:

4.png

使用属性检查器设置它的 Identifier 为 FlightRow。使用 identifier 作为行的类型标示来通知列表哪一行应该被实例化,它非常重要,所以需要你去设置。

设计界面

首先修改行提供的默认布局。从文档大纲中选择 table row 中的组,使用属性检查器设置组的 Spacing 为6、Height 为 Size To Fit Content。

table row 默认有个标准、固定的高度。然而,大多数时候你会希望能显示全部添加进去的界面元素,所以总是值得使用这种方式去修改高度属性。

将一个分隔线从对象库中拖到行中。你不会真的用它去分割什么,而是向你的行里添加一点视觉上的间隔。选中分割线,使用属性检查器做如下修改:<

  • 设置 Color 为 #FA114F;

  • 设置 Vertical alignment 为 Center;

  • 设置 Height 为 Relative to Container;

  • 设置 Adjustment 为-4。

最后检查器应该是这样:

5.png

现在是时候填充这一行了!

从对象库中拖一个Group到到 table row 中,放在分割线的后面。选中组,在属性检查器中修改如下属性:

  • 设置 Layout 为 Vertical;

  • 设置 Spacing 为0;

  • 设置 Width 为 Size To Fit Content。

你可能注意到你经常设置的 Spacing 属性;它的作用仅仅是收紧组中的界面元素之间的间距让它们在小屏幕上看起来更清晰。

拖动另一个 Group 到刚才添加的组中,做如下改变:

  • 设置 Spacing 为4;

  • 设置 Height 为 Fixed,值为32。

往这个新的组中,添加一个 Label、一个 Image然后另一个 Label。这两个标签会显示每个航班的起点和重点。

现在你需要往 image 中添加图片。下载图片然后把它添加到 Watch\Assets.xcassets 中。这次创建一个新的叫做Plane的图片,放在2x槽中:

6.png

重新打开 Watch\Interface.storyboard 然后选择这个 image。使用属性检查器,做如下改变:

  • 设置 Image 为 Plane;

  • 设置 Tint 为 #FA114F;

  • 设置 Vertical alignment 为 Center;

  • 设置 Width 为 Fixed,值为24;

  • 设置 Height 为 Fixed,值为20。

选择左边的标签设置它的文本为 MAN。修改它的 Font 为 System, style 为 Semibold 和20的字体大小。最后设置它的 Vertical alignment 为 Center。

同样修改右边的标签,但是文本修改成 SFO。你的 table row 现在应该是这样:

7.png

界面元素层次结构像下面这样:

8.png

你已经完成大多数 table row 界面的设计;之后需要增加航班号和状态了。

从对象库中拖动另一个 Group 到 table row ,确保它是包含起点终点标签的那个组的子节点:

9.png

当你继续设计这个界面,你可以看到更多使用嵌套组与混合布局来创建复杂布局的例子。根本就没自动布局的事。

拖动两个 label 到新的组中。再次使用属性检查器对最左边的标签做如下的改变:

  • 设置 Text 为 AA123;

  • 设置 Text Color 为 Light Gray Color;

  • 设置 Font 为 Caption 2;

  • 设置 Vertical alignment 为 Bottom。

修改右边的标签:

  • 设置 Text 为 On time;

  • 设置 Text Color 为 #04DE71;

  • 设置 Font 为 Caption 2;

  • 设置 Horizontal alignment 为 Right;

  • 设置 Vertical alignment 为 Bottom。

做完这些改变后,最后的 table row 看起来应该像这样:

11.png

列表在 Interface Builder 中开发完成,是时候填充一些数据了。

填充列表

首先创建一个 WKInterfaceController 的子类为列表提供数据。

在项目导航中右击 Watch Extension 组选择New File...。在弹出的对话框中选择 watchOS\Source\WatchKit Class 然后点击Next。命名新的类为 ScheduleInterfaceController,确保它是 WKInterfaceController 的子类并且语言设置为 Swift:

12.png

点击 Next,然后 Create。

当在代码编辑器中打开了新创建的文件,删除三个空的方法后就剩下重要的语句和类定义了。

重新打开 Watch\Interface.storyboard ,选择新的界面控制器。在 Identity Inspector,修改 Custom Class\Class 为 ScheduleInterfaceController:

13.png

在选中界面控制器的基础上,打开辅助编辑器确保它显示的是 ScheduleInterfaceController。然后按住 Ctrl从 Table 往 ScheduleInterfaceController 里面拖拽来创建一个 outlet:

14.png

命名 outlet 为 flightTable,确保类型设置为 WKInterfaceTable 然后点击 Connect。

现在你已经设置好自定义的类并且为 table 创建了一个 outlet,是时候填充一些数据了!

关闭辅助编辑器,打开 ScheduleInterfaceController.swift,在 outlet 的下面添加如下代码

1
var  flights = Flight.allFlights()

这里你仅仅增加了一个 Flight 对象数组保存所有航班信息。

下一步,增加 awakeWithContext(_:) 的实现:

1
2
3
4
override func awakeWithContext(context: AnyObject?) {
   super .awakeWithContext(context)
   flightsTable.setNumberOfRows(flights.count, withRowType:  "FlightRow" )
}

这段代码通知 table 为 flights 数组中每个 flight 创建一个 Interface Builder 中的行实例。行的数量等于数组的大小,行的类型就是你在 storyboard 中设置的 identifier 的值。

编译运行。你会看到列表已经填充几行数据了:

15.png

你应该注意到列表中显示的是 Interface Builder 中的占位文本。为了修复这种情况,我们通过添加 row controller 分别配置每一行的 label。

添加 Row Controller

在项目导航中右击 Watch Extension 组然后选择 New File...。在出现的对话框中选择 watchOS\Source\WatchKit Class 然后点击 Next。命名新的类为 FlightRowContorller,确保这个类是 NSObject 的子类并且语言设置为 Swift 了:

16.png

点击 Next,之后 Create。

当新的文件在代码编辑器中打开了,在类的顶部增加如下代码:

1
2
3
4
5
6
@IBOutlet  var  separator: WKInterfaceSeparator!
@IBOutlet  var  originLabel: WKInterfaceLabel!
@IBOutlet  var  destinationLabel: WKInterfaceLabel!
@IBOutlet  var  flightNumberLabel: WKInterfaceLabel!
@IBOutlet  var  statusLabel: WKInterfaceLabel!
@IBOutlet  var  planeImage: WKInterfaceImage!

这里仅仅为每个你添加到 table row 中的 label 添加对应的 outlet。稍后会连接它们。

下一步,在这些 outlet 下面添加如下这个属性和对应的属性监视器:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// 1
var  flight: Flight? {
   // 2
   didSet {
     // 3
     if  let flight = flight {
       // 4
       originLabel.setText(flight.origin)
       destinationLabel.setText(flight.destination)
       flightNumberLabel.setText(flight.number)
       // 5
       if  flight.onSchedule {
         statusLabel.setText( "On Time" )
       else  {
         statusLabel.setText( "Delayed" )
         statusLabel.setTextColor(UIColor.redColor())
       }
     }
   }
}

下面一步步讲解是怎么回事:

  1. 你定义了类型为 Flight 的可选属性。记住,这个类是在 Flight.swift 中定义的,而 Flight.swift 是你在教程1中添加到 Watch Extension 中的共享代码的一部分;

  2. 添加了一个属性监视器,当属性被赋值的时候会触发;

  3. 当 flight 为 nil 的时候会提前退出。因为它是可选的,只有当 Flight 对象有效的时候才去设置标签的属性。

  4. 使用 flight 的相关属性去设置标签。

  5. 如果航班被延误了,改变标签的文本颜色,并相应地更新文本。

当 row controller 设置完成,现在需要更新 table row 来使用它。

打开 Watch\Interface.storyboard 然后在文档大纲中选择 FlightRow。使用 Identity Inspector,设置 Custom Class\Class 为 FlightRowController。

下一步,在文档大纲中右击FlightRow:

17.png

连接 planeImage 和 table row 中的 image,separator 与 table row 中的 separator。之后进行如下连线:

  • destinationLabel: SFO

  • flightNumberLabel: AA123

  • originLabel: MAN

  • statusLabel: On time

最后一步就是更新 ScheduleInterfaceController 来向列表中每个行控制器传递 Flight 对象。

打开 ScheduleInterfaceController.swift 之后在 awakeWithContext(_:) 底下添加如下代码:

101.png
这里使用 for 循环遍历列表中每一行来访问指定索引的行控制器。假如你成功设置了 controller 的 flight 属性,会触发 didSet 监视器并且设置 table row 中所有的标签。

是时候看看劳动成果了。编译运行。你会看到 table row 已经被相关的航班信息填充了:

19.png

响应行的选中事件

首先去重写 WKInterfaceController 中主要负责处理 table row 选中事件方法定义。

往 ScheduleInterfaceController 中添加如下代码:

100.png
这里使用行的索引来检索出合适的航班信息。之后显示航班详情界面,作为 context 属性传递 flight 给这个界面。presentControllerWithName(_:context:) 方法的name参数是你在 storyboard 中设置identifier的值。

现在你需要更新 FlightInterfaceController 来使用 context 的值来设置它的界面。

打开 FlightInterfaceController.swift,找到 awakeWithContext(_:) ,替换这句代码:

1
flight = Flight.allFlights().first!

为如下代码:

1
if  let flight = context as? Flight { self.flight = flight }

这里尝试转换 context 为 Flight 对象。如果转换成功就可以使用它来设置self.flight,这会触发属性监视器来设置界面。

最后,编译运行。如果你点击某个 table row ,你会看到航班详情界面模态弹出,显示你选中的航班的详情:

020.gif

恭喜!你已经完成你的第一个列表并且使用真实数据填充它;太棒了!

总结

这里目前教程的完整实例项目。

在这片教程中你学习到如何往界面控制器中添加一个列表,设计 table row 界面,创建一个行控制器,处理 table row 选中,显示其他界面控制器,传递 contexts。在这20分钟里面做了很多事情!

参考:

1. watchOS 2 教程(二):列表

2. watchOS 2 Tutorial Part 2: Tables

这篇关于watchOS 2教程(二):表格的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/578811

相关文章

Elasticsearch 在 Java 中的使用教程

《Elasticsearch在Java中的使用教程》Elasticsearch是一个分布式搜索和分析引擎,基于ApacheLucene构建,能够实现实时数据的存储、搜索、和分析,它广泛应用于全文... 目录1. Elasticsearch 简介2. 环境准备2.1 安装 Elasticsearch2.2 J

Linux系统中卸载与安装JDK的详细教程

《Linux系统中卸载与安装JDK的详细教程》本文详细介绍了如何在Linux系统中通过Xshell和Xftp工具连接与传输文件,然后进行JDK的安装与卸载,安装步骤包括连接Linux、传输JDK安装包... 目录1、卸载1.1 linux删除自带的JDK1.2 Linux上卸载自己安装的JDK2、安装2.1

Linux卸载自带jdk并安装新jdk版本的图文教程

《Linux卸载自带jdk并安装新jdk版本的图文教程》在Linux系统中,有时需要卸载预装的OpenJDK并安装特定版本的JDK,例如JDK1.8,所以本文给大家详细介绍了Linux卸载自带jdk并... 目录Ⅰ、卸载自带jdkⅡ、安装新版jdkⅠ、卸载自带jdk1、输入命令查看旧jdkrpm -qa

Java使用Curator进行ZooKeeper操作的详细教程

《Java使用Curator进行ZooKeeper操作的详细教程》ApacheCurator是一个基于ZooKeeper的Java客户端库,它极大地简化了使用ZooKeeper的开发工作,在分布式系统... 目录1、简述2、核心功能2.1 CuratorFramework2.2 Recipes3、示例实践3

springboot简单集成Security配置的教程

《springboot简单集成Security配置的教程》:本文主要介绍springboot简单集成Security配置的教程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录集成Security安全框架引入依赖编写配置类WebSecurityConfig(自定义资源权限规则

MySQL Workbench 安装教程(保姆级)

《MySQLWorkbench安装教程(保姆级)》MySQLWorkbench是一款强大的数据库设计和管理工具,本文主要介绍了MySQLWorkbench安装教程,文中通过图文介绍的非常详细,对大... 目录前言:详细步骤:一、检查安装的数据库版本二、在官网下载对应的mysql Workbench版本,要是

利用Python开发Markdown表格结构转换为Excel工具

《利用Python开发Markdown表格结构转换为Excel工具》在数据管理和文档编写过程中,我们经常使用Markdown来记录表格数据,但它没有Excel使用方便,所以本文将使用Python编写一... 目录1.完整代码2. 项目概述3. 代码解析3.1 依赖库3.2 GUI 设计3.3 解析 Mark

通过Docker Compose部署MySQL的详细教程

《通过DockerCompose部署MySQL的详细教程》DockerCompose作为Docker官方的容器编排工具,为MySQL数据库部署带来了显著优势,下面小编就来为大家详细介绍一... 目录一、docker Compose 部署 mysql 的优势二、环境准备与基础配置2.1 项目目录结构2.2 基

Linux安装MySQL的教程

《Linux安装MySQL的教程》:本文主要介绍Linux安装MySQL的教程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux安装mysql1.Mysql官网2.我的存放路径3.解压mysql文件到当前目录4.重命名一下5.创建mysql用户组和用户并修

Java利用poi实现word表格转excel

《Java利用poi实现word表格转excel》这篇文章主要为大家详细介绍了Java如何利用poi实现word表格转excel,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 一、每行对象类需要针对不同的表格进行对应的创建。package org.example.wordToEx