EventKit 學習(譯)


From:http://docs.xamarin.com/guides/ios/platform_features/introduction_to_eventkit/ 

 本教程展示了對於如何通過EventKit訪問和使用存儲在日歷數據庫(Calendar Database)中的日歷(Calendars)、日歷事件(CalendarEvents)和提醒的概述。並且講述了重要的類(Class)還有他們的在編程中的用法,當然還有一些有關EventKit框架的常用任務。

  概述


 

  iOS有兩個內建的日歷應用:Calendar,Reminders。很顯然能看出Calendar是管理日歷數據的,而Reminders卻不是特別顯而易見。Reminders擁有在指定時間安排、完成等等的事件的日期。比如,iOS存儲着所有的日歷數據,無論它屬於日歷事件(calendar events)或者提醒(reminders),他們都屬於日歷數據庫(Calendar Database)。

  EventKit框架提供了一種訪問存儲在日歷數據庫(Calendar Database)的日歷、日歷事件、提醒數據的方式。iOS4開始就支持訪問日歷和日歷事件、而iOS6起增加支持訪問提醒。

  這個教程我們包含下面內容:

  • EventKit Basics - 這部分會通過主要的類(Class)介紹EventKit的基礎,並且對他們的用法進行闡述。這部分是下面部分的必要部分。
  • Common Tasks - 這部分旨在講解一些常用的用法,比如 遍歷日歷,創建、保存、檢索日歷事件和提醒,就像使用內建應用一樣創建修改日歷事件。這部分不需要從頭至尾的讀,這意味着它只是對特殊的任務的參考。

教程中得所有任務都有例子:

 

 

  必要條件


  EventKit是在iOS4.0提出的,但訪問提醒(Reminders)是在iOS6中提出。這樣的話,通常做EventKit 開發,使用日歷要基於iOS4.0,提醒需要基於iOS6。

  另外,Reminders應用程序不適用於模擬器,這意味着提醒數據是不可以用的,除非你先添加了他們。還有,訪問請求(assess requests)只在真實設備上展示給用戶。這樣的話,EventKit開發要基於真實設備來測試。

  

  Event Kit 基礎


  當我們使用EventKit的時候,重要的是掌握常用類和他們的用法。所有的類(Class)都可以在MonoTouch.EventKit 和 MonoTouch.EventKitUI(for the EKEventEditController)中找到.

  EventStore

  EventStore是EventKit中最重要的類,因為在EventKit中執行的任何操作都需要它。EventStore可以認為是 持久存儲器 或者 數據庫,EventKit數據的引擎。從EventStore中,你可以訪問到Calendar應用程序中得日歷還有日歷事件,當然還有Reminders應用中得提醒。

  因為EventStore很像一個數據庫引擎,所以他應該長久持有,這意味着在應用的生命周期內它應該盡可能的少創建、銷毀。實際,建議這樣:一旦你在應用中創建了一個EventStore,你應該在應用的生命周期內保持它(EventStore)的引用,除非你確定你再不使用它了。另外,所有的調用都針對魚一個EventStore實例。所以呢,推薦單例模式。

  Creating an Event Store

  下面的代碼,說明了一個簡單而有效方式創建一個EventStore的單例,使它在應用中靜態存在。

 1 public class App
 2 {
 3         public static App Current {
 4                 get { return current; }
 5         }
 6         private static App current;
 7 
 8         public EKEventStore EventStore {
 9                 get { return eventStore; }
10         }
11         protected EKEventStore eventStore;
12 
13         static App ()
14         {
15                 current = new App();
16         }
17         protected App () 
18         {
19                 eventStore = new EKEventStore ( );
20         }
21 }

  上面的代碼在應用加載的時候 使用了單例模式實現了EventStore對象。這個對象能夠全局的訪問,像這樣:

App.Current.EventStore;

  請求 日歷 和 提醒 數據

  在允許通過EventStore訪問任何數據之前,應用程序必須首先獲取權限,無論日歷事件(calendar event)還是 提醒數據(reminders data),取決於你。為此,EventStore暴露了一個方法RequestAccess,當調用它的時候,系統會彈出一個提示框給用戶,告訴用戶應用程序請求訪問日歷數據或者提醒數據。因為有提示框,所以這個調用是異步的,並且完成后會有一個帶兩個參數(一個bool類型的granted和 NSError)的回調被調用,指出是否獲取到權限訪問。

  下面代碼就是請求權限訪問日歷事件:

1 App.Current.EventStore.RequestAccess (EKEntityType.Event, 
2         (bool granted, NSError e) => {
3                 if (granted)
4                         //do something here
5                 else
6                         new UIAlertView ( "Access Denied", "User Denied Access to Calendar Data", null,"ok", null).Show ();
7                 } );

  一旦請求被允許,這個應用只要安裝在設備上,那么就不會在被彈出再提示。但是,權限只是允許訪問給出的資源類型,是日歷事件或提醒。如果一個應用需要這兩種都能訪問,那就都要請求。

  因為權限是被緩存的了,那么每次請求相對輕松,所以在每個操作之前都請求權限是個不錯的主意。

  另外,因為回調方法是在非UI線程中調用的,所以所有更新UI得操作都要在Main Thread調用,否則就會引發異常。

  EKEntityType

  這是個描述EventKit或者數據的類型 的枚舉類型,它有兩個值:Event、Reminder。它在很多方法中被使用,包括EventStore的RequestAccess方法,告訴EventKit要獲取什么類型的數據權限。

  EKCalendar

  EKCalendar相當於一個日歷,包含了一組日歷事件,日歷能夠存儲在很多地方,例如 本地、iCloud、第三方商:Exchange Sever 或者Google。大多時候,EKCalendar被用來告知EventKit,事件從何查找,存儲到哪里。

  EKEventEditController

  EKEventEditController能夠在MonoTouch.EventKitUI中找到,它是個內建的控制器,用於創建修改日歷事件。這很像內建的相機控制器,EKEventEditController幫你做了繁重的UI和保存數據的工作。

  EKEvent

  EKEvent相當於一個日歷,不管是EKEvent還是EKReminder都繼承於EKCalendarItem,他們都有Title、Notes等字段。

  EKReminder

  EKReminder相當於一個提醒事項。

  EKSpan 

  EKSpan是個當修改事件為可重復的時候用於描述事件的跨度的枚舉值,它有兩個值:ThisEvent、FutureEvents。ThisEvent意味着任何改變,只會發生在被引用的一系列特定事件,而FutureEvents會影響事件和所有未來的復發。

 

  Tasks


 都是代碼了,參照原文

 還有Apple的Guide

Calendar and Reminders Programming Guide

 https://developer.apple.com/library/prerelease/ios/documentation/DataManagement/Conceptual/EventKitProgGuide/Introduction/Introduction.html#//apple_ref/doc/uid/TP40009765

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM