Xamarin 中的 watchOS 表格控件
watchOS WKInterfaceTable
控制項比其 iOS 控制件簡單得多,但會執行類似的角色。 它會建立可具有自定義版面配置的數據列卷動清單,以及回應觸控事件。
新增數據表
將 數據表 控件拖曳至場景。 根據預設,它看起來會像這樣(顯示單一未指定的數據列配置):
在 [屬性] 面板的 [名稱] 方塊中為數據表指定名稱,以便在程式代碼中參考它。
新增數據列控制器
數據表會自動包含單一數據列,由預設包含 群組 控件的數據列控制器表示。
若要設定資料列控制器的類別,請選取 [檔案大綱] 中的數據列,然後在 [屬性] 面板中輸入類別名稱:
設定數據列控制器的 類別之後,IDE 會在專案中建立對應的 C# 檔案。 將控件(例如標籤)拖曳到數據列,併為其命名,以便在程式代碼中參考它們。
建立和填入數據列
SetNumberOfRows
使用 Identifier
來選取正確的數據列,為每個數據列建立數據列控制器類別。 如果您為資料列控制器提供自定義 Identifier
,請將下列代碼段中的預設值變更為您所使用的識別碼。 RowController
呼叫 時SetNumberOfRows
會建立每個數據列的 ,並顯示數據表。
myTable.SetNumberOfRows ((nint)rows.Count, "default");
// loads row controller by identifier
重要
數據表數據列不會像在iOS中一樣虛擬化。 嘗試限制數據列數目(Apple 建議小於 20 個)。
建立數據列之後,您必須填入每個數據格(就像在 iOS 中所做的一樣 GetCell
)。 此代碼段會更新每個資料列中的標籤:
for (var i = 0; i < rows.Count; i++) {
var elementRow = (RowController)myTable.GetRowController (i);
elementRow.myRowLabel.SetText (rows [i]);
}
重要
使用 SetNumberOfRows
,然後迴圈 GetRowController
使用 會導致整個數據表傳送至監看式。 在數據表的後續檢視中,如果您需要新增或移除特定數據列的使用 InsertRowsAt
,並 RemoveRowsAt
提升效能。
回應點選
您可以透過不同的方式回應資料列選取:
- 在
DidSelectRow
介面控制器上實作 方法,或 - 如果您要開啟另一個場景,請在分鏡腳本上建立segue並實
GetContextForSegue
作 。
DidSelectRow
若要以程式設計方式處理數據列選取,請實作 DidSelectRow
方法。 若要開啟新的場景,請使用 PushController
並傳遞場景的標識碼和數據內容,以使用:
public override void DidSelectRow (WKInterfaceTable table, nint rowIndex)
{
var rowData = rows [(int)rowIndex];
Console.WriteLine ("Row selected:" + rowData);
// if selection should open a new scene
PushController ("secondInterface", rows[(int)rowIndex]);
}
GetContextForSegue
將分鏡腳本上的 Segue 從表格列拖曳到另一個場景(拖曳時按住 Control 鍵)。
請務必選取 segue,並在 [屬性] 面板中為其指定標識碼(如secondLevel
下列範例所示)。
在介面控制器中,實 GetContextForSegue
作 方法,並傳回應該提供給 segue 所呈現場景的數據內容。
public override NSObject GetContextForSegue (string segueIdentifier, WKInterfaceTable table, nint rowIndex)
{
if (segueIdentifier == "secondLevel") {
return new NSString (rows[(int)rowIndex]);
}
return null;
}
此數據會在其方法中 Awake
傳遞至目標分鏡腳本場景。
多個數據列類型
根據預設,數據表控件具有您可以設計的單一數據列類型。 若要新增更多數據列 'templates',請使用 [屬性] 板中的 [數據列] 方塊來建立更多數據列控制器:
將 Rows 屬性設定為 3 會為您建立額外的數據列佔位元元,讓您將控制件拖曳至 。 針對每個數據列,在 Properties pad 中設定類別名稱,以確保已建立數據列控制器類別。
若要以不同的數據列類型填入數據表, SetRowTypes
請使用 方法來指定要用於數據表中每個數據列的數據列控制器類型。 使用數據列的識別碼來指定每個數據列應該使用哪個數據列控制器。
此陣列中的元素數目應該符合您預期在資料表中的數據列數目:
myTable.SetRowTypes (new [] {"type1", "default", "default", "type2", "default"});
使用多個資料列控制器填入資料表時,您必須追蹤您在填入 UI 時預期的類型:
for (var i = 0; i < rows.Count; i++) {
if (i == 0) {
var elementRow = (Type1RowController)myTable.GetRowController (i);
// populate UI controls
} else if (i == 3) {
var elementRow = (Type2RowController)myTable.GetRowController (i);
// populate UI controls
} else {
var elementRow = (DefaultRowController)myTable.GetRowController (i);
// populate UI controls
}
}
垂直詳細數據分頁
watchOS 3 引進了數據表的新功能:能夠捲動與每個數據列相關的詳細數據頁,而不需要返回數據表並選擇另一個數據列。 詳細數據畫面可以向上和向下卷動,或使用數位皇冠來捲動。
重要
此功能目前只能透過在 Xcode Interface Builder 中編輯分鏡腳本來使用。
若要啟用此功能,請選取 WKInterfaceTable
設計介面上的 ,然後勾選 [垂直詳細數據分頁 ] 選項:
如 Apple 所說明,數據表導覽必須使用 Segue 來提供分頁功能才能運作。 請改寫任何使用 PushController
segue 的現有程式代碼。
附錄:數據列控制器程式代碼範例
當設計工具中建立數據列控制器時,IDE 會自動建立兩個程式代碼檔案。 這些產生的檔案中的程序代碼如下所示以供參考。
第一個會針對 類別命名,例如 RowController.cs,如下所示:
using System;
using Foundation;
namespace WatchTablesExtension
{
public partial class RowController : NSObject
{
public RowController ()
{
}
}
}
另一 個.designer.cs 檔案是一個部分類別定義,其中包含在設計工具介面上建立的輸出和動作,例如此範例搭配一個 WKInterfaceLabel
控件:
using Foundation;
using System;
using System.CodeDom.Compiler;
using UIKit;
namespace WatchTables.OnWatchExtension
{
[Register ("RowController")]
partial class RowController
{
[Outlet]
[GeneratedCode ("iOS Designer", "1.0")]
public WatchKit.WKInterfaceLabel MyLabel { get; set; }
void ReleaseDesignerOutlets ()
{
if (MyLabel != null) {
MyLabel.Dispose ();
MyLabel = null;
}
}
}
}
然後,您可以在程式代碼中參考此處宣告的輸出和動作,不過 不應該直接編輯.designer.cs 檔案。