使用table展示內容可動態更改的列表資料。WatchKit 僅支援使用WKInterfaceTable類的單列表格。想要在table中展示資料,需要先為資料定義佈局,並在執行時通過編碼填寫表資料。您需要在Xcode工程中做以下事情:
在storyboard檔案中:
- 給介面控制器場景新增table物件,並在介面控制器中為table建立一個outlet。
- 像Configuring Row Types描述的那樣為table配置一個或多個row types。
在程式碼中:
- 為依照Configuring Row Types定義的row type定義一個row controller 類。
- 在初始化階段,依照Configuring the Table’s Contents at Runtime向table中新增行
- 按照Handling Row Selections所述響應使用者與表格行的互動。
您可以為每個table定義多個行型別,每種型別都有不同的外觀。在執行時,您可以指定所需行型別以及它們在table中的排列順序。對於如何配置table的詳細資訊,請參看WKInterfaceTable Class Reference.
配置Row Types
Row Type是一個在table中以單行形式展示資料的模板。每個table必須至少有一個row type,您可以根據需求定義額外的row type。您可以用row type區分table中的不同內容。比如您可能在內容行上、標題和註腳上使用不同的型別。當您為介面控制器場景新增table時,Xcode會自動建立初始的row types供您配置。
為table新增row types:
- 在storyboard檔案中選中table物件
- 開啟Attributes inspector.
- 使用Rows屬性更改可用row type數量。
每個row type最初都包含一個單個組元素。您可以為該組元素新增標籤、圖片以及其他所需物件。標籤和圖片的真實內容通常是無關緊要的。在執行時,作為配置工作的一部分,您可以替換介面物件的內容。
想要在執行時管理表格行的內容,您需要提供一個自定義的row controller 類。大部分row controller類包含少量程式碼,或者根本就不包含程式碼,它們主要用來訪問那些包含介面物件的outlets。不過,如果您在表格行中新增了按鈕或者其他控制元件,那麼其類也會包含一些動作方法,以響應使用者與控制元件的互動。
為row type定義一個row controller類:
- 為WatchKit擴充套件新增一個新的Cocoa Touch類
- 讓新類繼承NSObject。
- 為每個計劃在執行時訪問的標籤、圖片或者控制元件新增宣告的屬性。宣告屬性可使用以下格式,請更改類以匹配相應的介面物件:
-
1@property (weak, nonatomic) IBOutlet WKInterfaceLabel* label;
Listing 10-1 展示了一個用於管理row type的示例類
1 2 3 4 |
@interface MainRowType : NSObject @property (weak, nonatomic) IBOutlet WKInterfaceLabel* rowDescription; @property (weak, nonatomic) IBOutlet WKInterfaceImage* rowIcon; @end |
您可以在storyboard檔案中完成row type配置。配置表格行要求設定其類,並將任何outlets連線到對應的介面物件上。您還必須提供一個方法,以便通過命名row type在執行時辨別表格行。
在storyboard中配置row type:
- 在storyboard檔案中選中row controller物件。
- 將row controller的Identifier屬性設定為唯一值,隨後您會在建立表格行時使用該識別符號。
在行型別中該值必須是唯一的,但是實際值還是由您來定奪。在Attributes inspector中設定該值。
- 將row type的類設定為您的自定義類。您需要在Identity inspector中設定類資訊。
將row type元素和類中對應的outlets連線起來。
- 將storyboard檔案中的專案和outlets連線並繫結。當您在程式碼中配置table時,WatchKit會在執行時使用該資訊例項化對應的類。
Figure 10-1 在Xcode中配置一個命名為”Main Row Type”的row type,並設定為使用Listing 10-1中定義的MainRowType類。該類中的rowDescription 和rowIcon outlets被連線到行中的圖片和標籤。
執行時配置table內容
在執行時,您可以為table新增表格行並以程式設計形式配置其內容。通常,新增並配置表格行是初始化介面控制器過程中的一部分。
建立並配置列表行
- 先決定你需要建立的行的數目和型別,這取決於你想要展示的資料型別。
- 使用setRowTypes:或者setNumberOfRaws:withRowType:方法來建立。這兩個方法都會在介面上建立新的列表行,並且會在WatchKit擴充套件中例項化對應的類。這些例項被儲存在table中,且可通過rowControllerAtIndex:方法訪問。
- 使用rowControllerAtIndex:方法遍歷表格中的每一行。
- 使用row controller物件來配置每一行中的內容。
setRowType:和setNumberOfRaws:withRowType:方法例項化與storyboard檔案中對應的行型別相關的類。在呼叫這些方法之後,緊接著就可以直接獲取最新建立的row controller物件了,當然還可以通過這些物件來設定內容。下面的Listing 10-2這段程式碼則是一個能建立新行並對其進行配置的簡單示例。在這個例子裡,使用的是在程式碼Listing 10-1中定義的MainRowType類,以及自定義的MyDataObject類,MyDataObject類用於提供table中用於行內容的資料。在setNumberOfRaws:withRowType:方法中設定好資料物件之後,程式碼會遍歷該物件,並使用它們配置表格中每一行的內容。
Listing 10-2 建立並配置table中的行
1 2 3 4 5 6 7 8 9 10 |
- (void)configureTableWithData:(NSArray*)dataObjects { [self.table setNumberOfRows:[dataObjects count] withRowType:@"mainRowType"]; for (NSInteger i = 0; i < self.table.numberOfRows; i++) { MainRowType* theRow = [self.table rowControllerAtIndex:i]; MyDataObject* dataObj = [dataObjects objectAtIndex:i]; [theRow.rowDescription setText:dataObj.text]; [theRow.rowIcon setImage:dataObj.image]; } } |
表格行的選中處理
介面控制器負責處理table中的行選中操作。當使用者點選table中的某一行,WatchKit會選中該行並呼叫WatchKit擴充套件中正確的方法。您可以在以下地方處理表格行的選中操作:
- 介面控制器的table:disSelectRowAtIndex:方法中。
- 介面控制器自定義的動作方法中。
您可以使用以上兩者之一來處理行選中事件。如果您的介面控制器有多個table,那推薦使用一個動作方法,因為您無需判定操作跟哪個table有關。如果您使用了一個動作方法,那需要遵循下面的語法:
1 |
- (IBAction)myTableAction:(NSInteger)rowIndex |
通過選中表格行來執行app相關的任何操作,比如跳轉新介面,或者更新行中顯示的內容。如果您不希望使用者選中表格行,可以在Storyboard中禁用相應的row controller的Selectable選項。