本文章是一個系列,如果有興趣可以看看以下文章:
AppleWatch開發入門(1)——界面布局
AppleWatch開發入門(2)——代碼交互、控制器生命周期、界面跳轉
AppleWatch開發入門(3)——Table視圖的應用
AppleWatch開發入門(4)——Picker視圖的應用
AppleWatch開發入門(5)——Menu的使用
AppleWatch開發入門(6)——watchOS中通知的應用
AppleWatch開發入門(7)——AlertController
AppleWatch開發入門(8)——動畫
一、簡介
iWatch 中的 Table 和 iPhone 中的 UITableView 還是有很大的區別,在開發之前,我們應該明白 WatchOS 中 Table 的局限性和特點。
- Table 只有行的概念,沒有分區的概念,沒有頭尾視圖的概念。
- 可以通過創建多個 Table,來實現分區的效果。
- 因為 iWatch 上是通過 Gruop 進行布局適應的,所以沒有行高等設置。
- Table 沒有代理,所有行的數據都是采用靜態配置的方式。
- 點擊 Table 中的行觸發的方法,是通過重寫 Interface 中的方法來實現的。
二、創建一個Table
在 storyboard 中拖入 Table,如下:
在 Table 上放兩個 Label:
每個 Table 中包含一個 TableRowController,實際上我們 Table 上的控件都是通過 TableRowController 進行管理的,因此如果我們需要在代碼中控制 TableRow 上的內容,我們需要新建一個類作為 Table 的 TableRowController,繼承自 NSObject:
將 storyboard 中的 TableRowController 修改為我們創建的類,并指定 Identifier:
選中 TableRowController 時,注意不要選中 Group,同時 Group 也可以調整控件的布局方式。
然后,將兩個 Label 關聯到 TableRowController 中:
import WatchKit
class TableRowController: NSObject {
@IBOutlet var titleLabel: WKInterfaceLabel!
@IBOutlet var numberLabel: WKInterfaceLabel!
}
將 Table 關聯到 InterfaceController 中:
class InterfaceControllerMain: WKInterfaceController {
@IBOutlet var table: WKInterfaceTable!
}
下面,我們開始在interface中對Table做相關配置,WatchOS的Table配置非常簡單易用,例如我們如下配置:
override func awake(withContext context: Any?) {
super.awake(withContext: context)
let dict = [["name" : "中國建設銀行", "money" : "¥1000"],
["name" : "中國農業銀行", "money" : "¥5000"],
["name" : "中國工商銀行", "money" : "¥2000"],
["name" : "中國招商銀行", "money" : "¥4010"],
["name" : "中國郵政儲蓄", "money" : "¥1100"]]
table.setNumberOfRows(dict.count, withRowType: "TableRow")
for (idx, info) in dict.enumerated() {
let cell = table.rowController(at: idx) as! TableRowController
cell.titleLabel.setText(info["name"])
cell.numberLabel.setText(info["money"])
}
}
這樣一個展示銀行卡余額的界面我們就創建完成了,效果如下:
三、關于Table的點擊事件
上面我們提到,Table 沒有所謂代理方法,點擊 cell 的時候,我們也是通過兩種方式進行邏輯跳轉的。
- 一種是在 storyboard 中,通過拖拽 TableRowController 拉線跳轉,這時如需傳值,我們需在 Interface 中重寫如下方法:
open func contextForSegue(withIdentifier segueIdentifier: String, in table: WKInterfaceTable, rowIndex: Int) -> Any?
- 另一種方式,重寫如下方法,來處理Table的點擊事件:
open func table(_ table: WKInterfaceTable, didSelectRowAt rowIndex: Int)
無論哪種方式,我們都可以通過參數 table 和 rowIndex 來確認點擊的具體是那個table和哪一行,進行傳值和處理我們的邏輯。