天天看點

《MonoTouch開發實踐指南》一3.3 為視圖控制器及其視圖添加功能

為了更好地了解視圖控制器及其視圖是如何工作的,下面将示例做得更有趣點兒。ios裝置有一個加速度計,可以通過測量重力來跟蹤原點位于螢幕中心的坐标系中的x(右)、y(上)、z(螢幕外)方向。如圖3-10所示,在sampleviewcontroller中添加代碼用來記錄裝置移動時的加速度資料。使用加速度計也将示範在ios中另一個關鍵模式:委托。接下來的代碼,可以簡單地通過修改目前項目代碼實作,不過在本書的示例代碼中,該代碼是作為單獨的工程lmt3-2實作的。

注意 在模拟器中是沒有加速度計的。

要使用加速度計,需要使用uiaccelerometer類。要建立uiaccelerometer的執行個體,需要使用uiaccelerometer類的靜态屬性sharedaccelerometer。一旦建立uiaccelerometer執行個體,就可以通過設定它的updateinterval屬性來更新坐标資訊。不過,為了接收更新資訊,需要為它設定委托。

在之前的一些地方已經使用過委托了。在monotouch中,委托就是類,一個派生于特定基類類型的子類,并由類指定它為委托。回想一下,在objective-c中,委托就是采用特定objective-c協定的類。委托(不要與c#的委托混淆在一起)的目的是處理從不同的委托類發送過來的回調方法。例如,uiaccelerometer類的委托類型為uiaccelerometerdelegate。當某些事情發生時(如加速度計的資料可用),uiaccelerometer将會調用委托類中的相關方法。委托模式在類與它的回調之間實作了松耦合,這樣可以在類中自定義應用程式如何響應某些事件,而無須子類化uiaccelerometer這樣的主類。

為了接收加速度計的更新,需要實作uiaccelerometerdelegate的didaccelerate方法。該方法接收一個包含相關加速度資料的uiacceleration對象。因為要在控制器的loggingview中追加裝置移動時的資料,是以需要傳遞控制器的指針到委托類。代碼清單3-2列出了在uiaccelerometer和在sampleviewcontroller中它的委托實作代碼。

代碼中設定了更新的間隔時間為0.25秒,這樣,1秒就會接收4次加速度資料。通常,可以使用加速度資料來控制螢幕上的東西,如遊戲中的元素移動,在這種情況下,需要将時間間隔設定小點兒,以實作更高的重新整理頻率。不過,該示例隻是記錄數值,因而設定時間間隔高點兒合乎要求。另外,還要注意在控制器中保持uiaccelerometerdelegate的執行個體,以保證它不會無意間被垃圾收集器回收。

當在委托中獲得uiacceleration對象時,就可使用傳遞過來的控制器執行個體更新ui中的資料。uitextview的appendtextline方法是一個小型擴充方法,用來添加文本到新行,并總是将文本視圖滾動到底部,其代碼如下:

在控制器中嵌套委托類是一種在monotouch應用程式中使用委托的常見結構,包括控制器自身和它使用的類,如示例中的uiaccelerometer。在objective-c中,不需要嵌套類,因為委托就是用協定定義的。一個類,如控制器,可根據需要采用許多不同的協定,并直接在類中實作委托方法。objective-c中的協定更接近于c#中的接口。不過,因為接口不允許可選方法,是以在monotouch中需要使用子類來模拟協定。這樣做稍微麻煩些,是以在monotouch中也可通過c#事件來實作各種協定方法。如果一個c#事件是一個特定的協定方法,就可以避免使用嵌套子類,而使用事件。在功能上,它們做的事情是一樣的,選擇哪種方式隻是個人偏好問題。對于uiaccelerometer示例,如代碼清單3-3所示,可以使用uiaccelerometer的accelerated事件來實作相同的回調,這樣可以大大簡化代碼。

代碼清單3-3 uiaccelerometer使用c#事件

繼續閱讀