你好,歡迎來到IOS教程網

 Ios教程網 >> IOS訊息 >> 關於IOS >> 創建日歷事件

創建日歷事件

編輯:關於IOS

下面我們討論如何在iOS中創建日歷事件。日歷事件主要涉及到EventKit框架。

首先我們需要對工程添加框架。點擊工程查看屬性,在Linked FrameWorks and Libraries中增加EventKit框架,並且將EventKit通過鼠標拖動移動到Frameworks文件夾:

下面我們去創建一個按鈕事件。

[cpp] view plaincopy

  1. - (IBAction)addEvent:(id)sender {
  2.     // create a new Event
  3.     EKEvent *event = [EKEvent eventWithEventStore: store];
  4.     // create start date & end date
  5.     NSDate *startDate = [[NSDate alloc] init];
  6.     NSDate *endDate = [[NSDate alloc] init];
  7.     // set event's properties
  8.     [event setTitle: @"an insert title"];
  9.     [event setStartDate: startDate];
  10.     [event setEndDate: endDate];
  11.     [event setAllDay: YES];
  12.     // insert new event into the default calendar
  13.     EKCalendar *calendar = [store defaultCalendarForNewEvents];
  14.     [event setCalendar: calendar];
  15.     // create an NSError pointer
  16.     NSError *err = nil;
  17.     // save event
  18.     [store saveEvent:event span:EKSpanThisEvent error:&err];
  19.     if (err == nil) {
  20.         UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Congratulations" message:@"event create success." delegate:nil cancelButtonTitle:@"ok" otherButtonTitles:nil];
  21.         [alert show];
  22.     } else {
  23.         UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Failed" message:@"event create failed." delegate:nil cancelButtonTitle:@"ok" otherButtonTitles:nil];
  24.         [alert show];
  25.     }
  26. }

 

在iOS 6以上版本中,我們需要對訪問權限進行授權,所以我們需要做以下操作。頭文件中:

[cpp] view plaincopy

  1. #import <UIKit/UIKit.h>
  2. #import <EventKit/EventKit.h>
  3. @interface ViewController : UIViewController
  4. - (IBAction)addEvent:(id)sender;
  5. @property EKEventStore *store;
  6. @property (strong, nonatomic) IBOutlet UIButton *myTestButton;
  7. @end

.m文件:

[cpp] view plaincopy

  1. #import "ViewController.h"
  2. @interface ViewController ()
  3. @end
  4. @implementation ViewController
  5. @synthesize store;
  6. @synthesize myTestButton;
  7. - (void)viewDidLoad
  8. {
  9.     [super viewDidLoad];
  10.     // get Event Store
  11.     store = [[EKEventStore alloc] init];
  12.     [self requestCalendarAccess];
  13. }
  14. - (void)didReceiveMemoryWarning
  15. {
  16.     [super didReceiveMemoryWarning];
  17.     // Dispose of any resources that can be recreated.
  18. }
  19. // This method is called when the user has granted permission to Calendar
  20. -(void)accessGrantedForCalendar
  21. {
  22.     // Update the UI with the above events
  23.     [myTestButton setEnabled:YES];
  24. }
  25. // Prompt the user for access to their Calendar
  26. -(void)requestCalendarAccess
  27. {
  28.     [store requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError *error)
  29.      {
  30.          if (granted)
  31.          {
  32.              // Let's ensure that our code will be executed from the main queue
  33.              dispatch_async(dispatch_get_main_queue(), ^{
  34.                  [self accessGrantedForCalendar];
  35.              });
  36.          }
  37.      }];
  38. }
  39. @end

 

以上是個簡單的例子,下面我們看一個更復雜的代碼。

建立項目

  1. 我們建立一個Master-Detail類型的工程,使用Storyboard。
  2. 這次我們添加兩個Framework,分別是EventKit和EventKitUI。
  3. 第一個頁面使用TableViewController,用於展現事件列表。
  4. 第二個頁面使用ViewController,用於展現事件描述;
  5. 注意在AppDelegate.m中添加:
[cpp] view plaincopy

  1. @synthesize window;
[cpp] view plaincopy

  1. //
  2. //  MasterViewController.m
  3. //  EventManager
  4. //
  5. //  Created by Sam Wang on 13-7-24.
  6. //  Copyright (c) 2013年 cn.impressmedia. All rights reserved.
  7. //
  8. #import "MasterViewController.h"
  9. #import "DetailViewController.h"
  10. @interface MasterViewController () {
  11. //    NSMutableArray *_objects;
  12. }
  13. @end
  14. @implementation MasterViewController;
  15. @synthesize store;
  16. @synthesize eventArray;
  17. @synthesize canDealWithEvent;
  18. - (void)awakeFromNib
  19. {
  20.     [super awakeFromNib];
  21. }
  22. // 請求獲取日歷應用的部分權限
  23. -(void)requestCalendarAccess {
  24.     [store requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError *error) {
  25.         if (granted) {
  26.             dispatch_sync(dispatch_get_main_queue(), ^{
  27.                 NSLog(@"gain event access");
  28.                 self.canDealWithEvent = YES;
  29.             });
  30.         } else {
  31.             dispatch_sync(dispatch_get_main_queue(), ^{
  32.                 NSLog(@"we haven't got any event access, so we can do nothing except exit.");
  33.                 self.canDealWithEvent = NO;
  34.             });
  35.         }
  36.     }];
  37. }
  38. // 刷新事件數組
  39. -(void)refreshEventArray {
  40.     if (canDealWithEvent == YES) {
  41.         return ;
  42.     }
  43.     // 從現在開始
  44.     NSDate *startDate = [NSDate date];
  45.     // 從現在開始的一個月時間
  46.     NSDateComponents *tomorrowDateComponents = [[NSDateComponents alloc] init];
  47.     // day year,等等均可設置
  48.     tomorrowDateComponents.month = 1;
  49.     NSDate *endDate = [[NSCalendar currentCalendar] dateByAddingComponents:tomorrowDateComponents
  50.                                                                     toDate:startDate
  51.                                                                    options:0];
  52.     // 僅搜索默認日歷對象
  53.     NSArray *calendarArray = [NSArray arrayWithObject:self.store.defaultCalendarForNewEvents];
  54.     NSPredicate *predicate = [self.store predicateForEventsWithStartDate:startDate
  55.                                                                       endDate:endDate
  56.                                                                     calendars:calendarArray];
  57.     // 搜索滿足斷言的事件
  58.     eventArray = [NSMutableArray arrayWithArray:[self.store eventsMatchingPredicate:predicate]];
  59. }
  60. - (void)viewDidLoad
  61. {
  62.     [super viewDidLoad];
  63.     // Do any additional setup after loading the view, typically from a nib.
  64.     canDealWithEvent = NO;
  65.     store = [[EKEventStore alloc] init];
  66.     [self requestCalendarAccess];
  67.     [self refreshEventArray];
  68.     self.navigationItem.leftBarButtonItem = self.editButtonItem;
  69.     UIBarButtonItem *addButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(insertNewObject:)];
  70.     self.navigationItem.rightBarButtonItem = addButton;
  71. }
  72. - (void)didReceiveMemoryWarning
  73. {
  74.     [super didReceiveMemoryWarning];
  75.     // Dispose of any resources that can be recreated.
  76. }
  77. - (void)insertNewObject:(id)sender
  78. {
  79.     if (!eventArray) {
  80.         eventArray = [[NSMutableArray alloc] init];
  81.     }
  82.     // create a new Event
  83.     EKEvent *event = [EKEvent eventWithEventStore: store];
  84.     // create start date & end date
  85.     NSDate *startDate = [[NSDate alloc] init];
  86.     NSDate *endDate = [[NSDate alloc] init];
  87.     // set event's properties
  88.     [event setTitle: @"new event"];
  89.     [event setStartDate: startDate];
  90.     [event setEndDate: endDate];
  91.     [event setAllDay: YES];
  92.     // insert new event into the default calendar
  93.     EKCalendar *calendar = [store defaultCalendarForNewEvents];
  94.     [event setCalendar: calendar];
  95.     // create an NSError pointer
  96.     NSError *err = nil;
  97.     // save event
  98.     [store saveEvent:event span:EKSpanThisEvent error:&err];
  99.     if (err == nil) {
  100.         NSLog(@"insert event success.");
  101.         [eventArray insertObject:[NSDate date] atIndex:0];
  102.         NSIndexPath *indexPath = [NSIndexPath indexPathForRow:(eventArray.count - 1) inSection:0];
  103.         [self.tableView insertRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
  104.     } else {
  105.         NSLog(@"insert failed.");
  106.     }
  107. }
  108. #pragma mark - Table View
  109. - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
  110. {
  111.     return 1;
  112. }
  113. - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
  114. {
  115.     return [eventArray count];
  116. }
  117. - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
  118. {
  119.     UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];
  120. //    NSDate *object = eventArray[indexPath.row];
  121. //    cell.textLabel.text = [object description];
  122.     EKEvent *event = eventArray[indexPath.row];
  123.     cell.textLabel.text = [event title];
  124.     return cell;
  125. }
  126. - (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath
  127. {
  128.     // Return NO if you do not want the specified item to be editable.
  129.     return YES;
  130. }
  131. - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
  132. {
  133.     if (editingStyle == UITableViewCellEditingStyleDelete) {
  134.         [eventArray removeObjectAtIndex:indexPath.row];
  135.         [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
  136.     } else if (editingStyle == UITableViewCellEditingStyleInsert) {
  137.         // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view.
  138.     }
  139. }
  140. /*
  141. // Override to support rearranging the table view.
  142. - (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath
  143. {
  144. }
  145. */
  146. /*
  147. // Override to support conditional rearranging of the table view.
  148. - (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath
  149. {
  150.     // Return NO if you do not want the item to be re-orderable.
  151.     return YES;
  152. }
  153. */
  154. - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
  155. {
  156.     if ([[segue identifier] isEqualToString:@"showDetail"]) {
  157.         NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
  158.         NSDate *object = eventArray[indexPath.row];
  159.         [[segue destinationViewController] setDetailItem:object];
  160.     }
  161. }
  162. @end

apple的示例代碼參見:SimpleEKDemo。

 

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