前面博客,有介紹EventKit這個框架的使用,使用EventKit能夠與系統的日曆和提醒應用進行交互,讀寫用戶的日程事件。EventKitUI,顧名思義,其實基於EventKit框架,提供了一套系統的事件管理界面。EventKit的基礎內容介紹以下:框架
http://www.javashuo.com/article/p-kubjnjza-ct.htmlui
EKCalendarChooser提供了選擇日曆,即選擇EKCalendar對象的視圖控制器,示例以下:atom
EKCalendarChooser *chooser = [[EKCalendarChooser alloc] initWithSelectionStyle:EKCalendarChooserSelectionStyleSingle displayStyle:EKCalendarChooserDisplayAllCalendars eventStore:self.eventStore]; chooser.showsDoneButton = YES; chooser.showsCancelButton = YES; chooser.delegate = self; [self.navigationController pushViewController:chooser animated:YES];
須要注意,在實例化EKCalendarChooser的時候,須要關聯一個EKEventStore對象,用來進行數據操做。spa
EKCalendarChooser中屬性方法以下:.net
// 實例化方法 /* typedef NS_ENUM(NSInteger, EKCalendarChooserSelectionStyle) { EKCalendarChooserSelectionStyleSingle, // 單選模式 EKCalendarChooserSelectionStyleMultiple // 多選模式 }; typedef NS_ENUM(NSInteger, EKCalendarChooserDisplayStyle) { EKCalendarChooserDisplayAllCalendars, // 展現所有日曆 EKCalendarChooserDisplayWritableCalendarsOnly // 只展現可寫的日曆 }; */ - (id)initWithSelectionStyle:(EKCalendarChooserSelectionStyle)selectionStyle displayStyle:(EKCalendarChooserDisplayStyle)displayStyle eventStore:(EKEventStore *)eventStore; // 實例化方法 entityType參數決定是 系統的日曆 仍是 提醒 對應的 EKCalander - (id)initWithSelectionStyle:(EKCalendarChooserSelectionStyle)style displayStyle:(EKCalendarChooserDisplayStyle)displayStyle entityType:(EKEntityType)entityType eventStore:(EKEventStore *)eventStore; // 獲取用戶選中的日曆 集合 @property(nonatomic, copy) NSSet<EKCalendar *> *selectedCalendars; // 選擇的風格 @property(nonatomic, readonly) EKCalendarChooserSelectionStyle selectionStyle; // 代理對象 @property(nonatomic, weak, nullable) id<EKCalendarChooserDelegate> delegate; // 是否展現完成按鈕 在導航上 @property(nonatomic) BOOL showsDoneButton; // 是否展現取消按鈕在導航上 @property(nonatomic) BOOL showsCancelButton;
EKCalendarChooserDelegate代理中定義的方法以下:代理
@protocol EKCalendarChooserDelegate <NSObject> @optional // 用戶選擇改變後觸發的回調 - (void)calendarChooserSelectionDidChange:(EKCalendarChooser *)calendarChooser; // 用戶選擇完成後觸發的回調 - (void)calendarChooserDidFinish:(EKCalendarChooser *)calendarChooser; // 用戶取消選擇後觸發的回調 - (void)calendarChooserDidCancel:(EKCalendarChooser *)calendarChooser; @end
EKEventViewController提供了展現某個事件詳情的試圖控制器,示例以下:code
- (void)queryEvent { for (EKCalendar *cal in [self.eventStore calendarsForEntityType:EKEntityTypeEvent]) { if ([cal.title isEqualToString:@"琿少的事項日曆"]) { NSCalendar *calendar = [NSCalendar currentCalendar]; NSDateComponents *oneMonthFromNowComponents = [[NSDateComponents alloc] init]; oneMonthFromNowComponents.month = 1; NSDate *oneMonthFromNow = [calendar dateByAddingComponents:oneMonthFromNowComponents toDate:[NSDate date] options:0]; NSPredicate*predicate = [self.eventStore predicateForEventsWithStartDate:[NSDate date] endDate:oneMonthFromNow calendars:@[cal]]; NSArray *eventArray = [self.eventStore eventsMatchingPredicate:predicate]; // 打開控制器 EKEventViewController *controller = [[EKEventViewController alloc] init]; controller.event = eventArray.firstObject; [self presentViewController:controller animated:YES completion:nil]; } } }
EKEventViewController也支持進行事件的編輯,其中屬性方法以下:對象
@interface EKEventViewController : UIViewController // 代理對象 @property(nonatomic, weak, nullable) id<EKEventViewDelegate> delegate; // 對應的事件對象,在使用控制器時,必須設置這個屬性 @property(nonatomic, retain, null_unspecified) EKEvent *event; // 設置是否容許編輯 @property(nonatomic) BOOL allowsEditing; // 設置是否容許日曆預覽 @property(nonatomic) BOOL allowsCalendarPreview; @end
EKEventViewDelegate中只定義了一個方法,以下:blog
@protocol EKEventViewDelegate <NSObject> @required // 完成某個行爲後會調用的代理回調 /* typedef NS_ENUM(NSInteger, EKEventViewAction) { EKEventViewActionDone, // 完成了事件 EKEventViewActionResponded, // 回覆了事件 EKEventViewActionDeleted, // 刪除了事件 }; */ - (void)eventViewController:(EKEventViewController *)controller didCompleteWithAction:(EKEventViewAction)action __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_4_2); @end
EKEventEditViewController提供了事件編輯的視圖控制器,對於可編輯的EKEventViewController視圖控制器,當用戶點擊的編輯按鈕後,也會調用EKEventEditViewController視圖控制器進行編輯,示例以下:事件
EKEventEditViewController *controller = [[EKEventEditViewController alloc] init]; controller.event = eventArray.firstObject; [self presentViewController:controller animated:YES completion:nil];
其中屬性方法以下:
@interface EKEventEditViewController : UINavigationController // 代理對象 @property(nonatomic, weak, nullable) id<EKEventEditViewDelegate> editViewDelegate; // 編輯行爲完成後,進行數據操做的EKEventStore對象 @property(nonatomic, retain, null_unspecified) EKEventStore *eventStore; // 要進行編輯的事件對象 @property(nonatomic, retain, nullable) EKEvent *event; // 取消編輯 - (void)cancelEditing; @end
EKEventEditViewDelegate解析以下:
@protocol EKEventEditViewDelegate <NSObject> @required // 完成某個編輯動做後調用 - (void)eventEditViewController:(EKEventEditViewController *)controller didCompleteWithAction:(EKEventEditViewAction)action; @optional // 設置新建事件默認對象的日曆 - (EKCalendar *)eventEditViewControllerDefaultCalendarForNewEvents:(EKEventEditViewController *)controller; @end