用户数据攻略-获取日历事件

#import <UIKit/UIKit.h>
#import <EventKit/EventKit.h>
#import <EventKitUI/EventKitUI.h>

@interface ViewController : UIViewController<UITableViewDelegate, UITableViewDataSource, EKEventEditViewDelegate, UIAlertViewDelegate>

@property (strong, nonatomic) EKEventStore *eventStore;
@property (weak, nonatomic) IBOutlet UITableView *eventsTableView;
@property (nonatomic, strong) NSMutableDictionary *events;
@property (nonatomic, strong) NSArray *calendars;

@end
  1 //
  2 //  ViewController.m
  3 //  My Events App
  4 //
  5 //  Created by Hans-Eric Grönlund on 8/27/12.
  6 //  Copyright (c) 2012 Hans-Eric Grönlund. All rights reserved.
  7 //
  8 
  9 #import "ViewController.h"
 10 
 11 @interface ViewController ()
 12 
 13 @end
 14 
 15 @implementation ViewController
 16 
 17 - (void)viewDidLoad
 18 {
 19     [super viewDidLoad];
 20     self.title = @"Events";
 21     UIBarButtonItem *refreshButton = [[UIBarButtonItem alloc]
 22                                       initWithBarButtonSystemItem:UIBarButtonSystemItemRefresh target:self
 23                                       action:@selector(refresh:)];
 24     self.navigationItem.leftBarButtonItem = refreshButton;
 25     
 26     UIBarButtonItem *addButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(addEvent:)];
 27     self.navigationItem.rightBarButtonItem = addButton;
 28     
 29     self.eventsTableView.delegate = self;
 30     self.eventsTableView.dataSource = self;
 31     
 32     self.eventStore = [[EKEventStore alloc] init];
 33     
 34     [self.eventStore requestAccessToEntityType:EKEntityTypeEvent
 35                                     completion:^(BOOL granted, NSError *error)
 36      {
 37          if (granted)
 38          {
 39              self.calendars =
 40              [self.eventStore calendarsForEntityType:EKEntityTypeEvent];
 41              [self fetchEvents];
 42          }
 43          else
 44          {
 45              NSLog(@"Access not granted: %@", error);
 46          }
 47      }];
 48 }
 49 
 50 - (void)refresh:(id)sender
 51 {
 52     [self fetchEvents];
 53     [self.eventsTableView reloadData];
 54 }
 55 
 56 - (void)fetchEvents
 57 {
 58     self.events = [[NSMutableDictionary alloc] initWithCapacity:[self.calendars count]];
 59     
 60     NSDate * now = [NSDate date];
 61     NSCalendar * calendar = [NSCalendar currentCalendar];
 62     
 63     NSDateComponents * fortyEightHoursFromNowComponents =
 64     [[NSDateComponents alloc] init];
 65     fortyEightHoursFromNowComponents.day = 2; // 48 hours forward
 66     NSDate * fortyEightHoursFromNow =
 67     [calendar dateByAddingComponents:fortyEightHoursFromNowComponents toDate:now
 68                              options:0];
 69     
 70     
 71     
 72     for (EKCalendar * calendar in self.calendars)
 73     {
 74         NSPredicate * allEventsWithin48HoursPredicate =
 75         [self.eventStore predicateForEventsWithStartDate:now
 76                                                  endDate:fortyEightHoursFromNow calendars:@[calendar]];
 77         NSArray * eventsInThisCalendar =
 78         [self.eventStore eventsMatchingPredicate:allEventsWithin48HoursPredicate];
 79         if (eventsInThisCalendar != nil)
 80         {
 81             [self.events setObject:eventsInThisCalendar forKey:calendar.title];
 82         }
 83     }
 84     dispatch_async(dispatch_get_main_queue(),^{
 85         [self.eventsTableView reloadData];
 86     });
 87 }
 88 
 89 - (void)addEvent:(id)sender
 90 {
 91     UIAlertView * inputAlert = [[UIAlertView alloc] initWithTitle:@"New Event" message:@"Enter a title for the event" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"OK", nil];
 92     inputAlert.alertViewStyle = UIAlertViewStylePlainTextInput;
 93     [inputAlert show];
 94 }
 95 
 96 - (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
 97 {
 98     if (buttonIndex == 1)
 99     {
100         // OK button tapped
101         
102         // Calculate the date exactly one day from now
103         NSCalendar * calendar = [NSCalendar currentCalendar];
104         NSDateComponents * aDayFromNowComponents = [[NSDateComponents alloc] init];
105         aDayFromNowComponents.day = 1;
106         NSDate * now = [NSDate date];
107         NSDate * aDayFromNow = [calendar dateByAddingComponents:aDayFromNowComponents toDate:now options:0];
108         
109         // Create the event
110         EKEvent * event = [EKEvent eventWithEventStore:self.eventStore];
111         event.title = [alertView textFieldAtIndex:0].text;
112         event.calendar = [self.eventStore defaultCalendarForNewEvents];
113         event.startDate = aDayFromNow;
114         event.endDate = [NSDate dateWithTimeInterval:60*60.0 sinceDate:event.startDate];
115         
116         // Make it recur
117         EKRecurrenceRule *repeatEveryMondayAndTuesdayRecurrenceRule = [[EKRecurrenceRule alloc]
118             initRecurrenceWithFrequency:EKRecurrenceFrequencyDaily
119             interval:2
120             daysOfTheWeek:@[[EKRecurrenceDayOfWeek dayOfWeek:2], [EKRecurrenceDayOfWeek dayOfWeek:3]]
121             daysOfTheMonth:nil
122             monthsOfTheYear:nil
123             weeksOfTheYear:nil
124             daysOfTheYear:nil
125             setPositions:nil
126             end:[EKRecurrenceEnd recurrenceEndWithOccurrenceCount:20]];
127         event.recurrenceRules = @[repeatEveryMondayAndTuesdayRecurrenceRule];
128 
129         // Save the event and update the table view
130         [self.eventStore saveEvent:event span:EKSpanThisEvent error:nil];
131         [self refresh:self];
132     }
133 }
134 
135 - (EKCalendar *)calendarAtSection:(NSInteger)section
136 {
137     return [self.calendars objectAtIndex:section];
138 }
139 
140 - (EKEvent *)eventAtIndexPath:(NSIndexPath *)indexPath
141 {
142     EKCalendar *calendar = [self calendarAtSection:indexPath.section];
143     NSArray *calendarEvents = [self eventsForCalendar:calendar];
144     return [calendarEvents objectAtIndex:indexPath.row];
145 }
146 
147 - (NSArray *)eventsForCalendar:(EKCalendar *)calendar
148 {
149     return [self.events objectForKey:calendar.title];
150 }
151 
152 -(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
153 {
154     return [self.calendars count];
155 }
156 
157 -(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
158 {
159     return [self calendarAtSection:section].title;
160 }
161 
162 -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
163 {
164     EKCalendar *calendar = [self calendarAtSection:section];
165     return [self eventsForCalendar:calendar].count;
166 }
167 
168 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
169 {
170     static NSString *CellIdentifier = @"Cell";
171     
172     UITableViewCell *cell =
173     [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
174     if (cell == nil)
175     {
176         cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1
177                                       reuseIdentifier:CellIdentifier];
178     }
179     
180     cell.accessoryType = UITableViewCellAccessoryDetailDisclosureButton;
181     cell.textLabel.backgroundColor = [UIColor clearColor];
182     cell.textLabel.font = [UIFont systemFontOfSize:19.0];
183     
184     cell.textLabel.text = [self eventAtIndexPath:indexPath].title;
185     
186     return cell;
187 }
188 
189 -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
190 {
191     EKEventViewController *eventVC = [[EKEventViewController alloc] init];
192     eventVC.event = [self eventAtIndexPath:indexPath];
193     eventVC.allowsEditing = YES;
194     [self.navigationController pushViewController:eventVC animated:YES];
195     [tableView deselectRowAtIndexPath:indexPath animated:YES];
196 }
197 
198 - (void)viewWillAppear:(BOOL)animated
199 {
200     [self refresh:self];
201     [super viewWillAppear:animated];
202 }
203 
204 -(void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath
205 {
206     EKEventEditViewController *eventEditVC = [[EKEventEditViewController alloc] init];
207     eventEditVC.event = [self eventAtIndexPath:indexPath];
208     eventEditVC.eventStore = self.eventStore;
209     eventEditVC.editViewDelegate = self;
210     [self presentViewController:eventEditVC animated:YES completion:nil];
211 }
212 
213 -(void)eventEditViewController:(EKEventEditViewController *)controller didCompleteWithAction:(EKEventEditViewAction)action
214 {
215     [self dismissViewControllerAnimated:YES completion:nil];
216 }
217 
218 -(EKCalendar *)eventEditViewControllerDefaultCalendarForNewEvents:
219 (EKEventEditViewController *)controller
220 {
221     return [self.eventStore defaultCalendarForNewEvents];
222 }
223 
224 - (void)didReceiveMemoryWarning
225 {
226     [super didReceiveMemoryWarning];
227     // Dispose of any resources that can be recreated.
228 }
229 
230 @end

posted @ 2016-06-16 17:01  FMDN  阅读(453)  评论(0编辑  收藏  举报