你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發基礎 >> WatchKit編程指南:Interface Object

WatchKit編程指南:Interface Object

編輯:IOS開發基礎

DC29BDFF1BE03BEE3FC0E88210D1DCA7.jpg

本文翻譯自Apple Watch Programming Guide:Interface Objects,敬請勘誤。

你可以使用界面對象(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關鍵字。例如,下面是一個標簽的聲明:

@interface MyHelloWorldController()
@property (weak, nonatomic) IBOutlet WKInterfaceLabel* label;
@end

在界面控制器中將已聲明屬性連接到Storyboard中相應的項目上。想要快速地創建屬性聲明並將其連接到Storyboard中的項目,可使用Xcode的輔助編輯器(Assistant editor)。將其從Storyboard裡面通過ctrl+拖拽至界面控制器的源文件中。接著Xcode會提醒你為該outlet命名,之後它會在類中添加該outlet的聲明並創建連接。

在設計階段配置界面

在設計階段,可以使用Xcode配置Storyboard中視覺元素的外觀。對於很多與布局相關的屬性,design-time是您可以配置屬性的唯一機會了。比如,你可以使用一個WKInterfaceLabel對象來更改標簽的文本、顏色以及字體,不過卻不能更改它的行數或者是行高。這些屬性必須在Xcode中配置,如下圖:

formatted_text_attributes.png

了解更多有關如何配置界面對象的信息,可參考WatchKit框架介紹中相關的類型描述。

在運行時更改界面


在WatchKit擴展的代碼中,你可以依靠調用任何引用的界面對象的方法來更新應用程序UI。界面控制器只有在激活狀態下才能改變界面對象的配置,當然也就包括初始化的時候。在init、WithContext:以及willActivate方法中,可以調用方法來為標簽、圖像以及其他用戶界面中的對象賦值。您也可以從界面控制器的動作方法中更新應用程序UI。

在初始化階段,請確保WatchKit在做其他事情之前先初始化interface controller class. 通過WKInterfaceController及其子類的初始化方法,WatchKit可以為app創建界面對象。所以您為界面控制器編寫的任何初始化代碼都必須首先調用父類的實現,如下Listing 7-1示例:

Listing 7-1 使用Swift初始化一個interface controller

override init {
    // Initialize variables here.
    super.init
 
    // It is now safe to access interface objects.
    label.setText("Hello New World")
}

Listing 7-2 使用Objective-C初始化一個interface controller

- (instancetype)initWithContext:(id)context {
// Always call super first.
self = [super initWithContext:context];
if (self){
// It is now safe to access interface objects.
[self.label setText:@“Hello New World”];
}
return self;
}

為了提高性能和延長電池壽命,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值就行了。

(本文由CocoChina翻譯,轉載請注明出處。)

  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved