WatchKit程式設計指南:Interface Object–介面物件

發表於2014-12-17

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值就行了。

相關文章