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

#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

时间: 2024-10-15 23:53:38

用户数据攻略-获取日历事件的相关文章

移动端点击事件全攻略,有你知道与不知道的各种坑

看标题的时候你可能会想,点击事件有什么好说的,还写一篇攻略?哈哈,如果你这么想,只能说明你too young to simple. 接触过移动端开发的同学可能都会面临点击事件的第一个问题:click事件的300ms延迟响应.不能立即响应给体验造成了很大的困扰,因此解决这个问题就成为了必然. 这个问题的解决方案就是: zepto.js的tap事件.tap事件可以理解为在移动端的click事件,而zepto.js因为几乎完全复制jQuery的api,因此常常被用在h5的开发上用来取代jquery.

UWP 应用获取各类系统、用户信息 (1) - 设备和系统的基本信息、应用包信息、用户数据账户信息和用户账户信息

应用开发中,开发者时常需要获取一些系统.用户信息用于数据统计遥测.问题反馈.用户识别等功能.本文旨在介绍在 Windows UWP 应用中获取一些常用系统.用户信息的方法.示例项目代码可参见 Github: https://github.com/validvoid/UWP-SystemInfoCollector 由于涉及内容较多,故本文会分为多篇展开.本篇介绍获取设备和系统的基本信息.应用包信息.用户数据账户信息和用户账户信息. 原博客阅读地址:http://validvoid.net/uwp-

R语言教程:写给高级入门者的数据打理攻略

http://developer.51cto.com/art/201312/423612_all.htm 原文地址 如果大家还未完全熟悉R语言.甚至不能轻松利用它实现最基本的处理任务,我建议各位先查阅其它指导文章.帮助自己积累对R语言的认识.但如果大家已经拥有一定的背景知识,希望能够进一步提升自己的开发技能——或者单纯只是想看看R语言如何完成文章中罗列的四项任务——那么请跟着我继续阅读. 学习如何添加column.计算总和.对结果排序以及数据改造. 强大的能力在带来责任之外,也给我们增添了恼人的

JQuery攻略(四)事件

jQuery事件处理,鼠标的单击,双击,悬停,键盘按键,文本动画..... 此章节有 1.1被点击的按钮查找 1.2事件的自动触发 1.3点击之后禁用按钮 1.4鼠标事件 1.5焦点事件 1.6CSS的操作 1.7元素创建 1.8动画隐藏和展示 1.9效果 1.10键盘输入控制 1.11防止事件冒泡 小结 1.1被点击的按钮查找 一个页面上有很多按钮,对应不同的功能,一个按钮对应一个事件,说到底就是给每个按钮绑定一个事件. <html xmlns="http://www.w3.org/19

PHP 基于laravel框架获取微博数据之二 用户数据的使用

开始抓取微博数据的时候,只是想获得一条热门微博下的所有评论,因为里面有不少图片广告,所以想试试能不能分析出热门微博评论里的异常用户. 使用PHP的Laravel框架后,通过队列.命令等各种功能,最后构架了一套完整的微博用户数据抓取平台,经过一段时间的运行积累了大量数据,那么使用这些数据能做什么呢? 微博数据分析很早就有人在做了,网上采集分析工具貌似有很多,搜索一下想找一些微博数据分析的具体方案.世事变幻,发现很多几年前的微博数据分析平台都不能用了,可能微博数据分析和微博一样在商业上还是没有什么更

.NET 微信开发之 获取用户数据

通过微信接口获取用户信息主要分为以下几个步骤: a.获取公众号的access_token b.通过查询所有用户OPenid接口获取所有用户. string url = "https://api.weixin.qq.com/cgi-bin/user/get?access_token=" + access_token; c.通过获取用户openid,然后通过openid获取用户数据 d.把用户信息添加到数据库中. 1.参数化查询以及添加用户信息到数据库方法 public void AddT

C#开发微信门户及应用(14)-在微信菜单中采用重定向获取用户数据

我曾经在系列文章中的<C#开发微信门户及应用(11)--微信菜单的多种表现方式介绍>中介绍了微信菜单里面的重定向操作,通过这个重定向操作,我们可以获取一个code值,然后获取用户的openID,进而就能获取到更多的用户信息,这个在会员信息的场景里面用的很多,本篇介绍在网站中迅速配置这样的菜单链接,并介绍如何在后台获取相关的用户信息,实现页面数据个性化的展现操作. 我们知道,微信的自定义菜单分为两大类,分别对应Click类型和View类型的,而重定向属于View类型的一种,如下所示. 1.微信重

微信获取用户数据后台写法,author2.0认证

1 /* 微信授权接口 */ 2 //1.设置路由 3 router.get('/wechat/userinfo', function(req, res) { 4 var cb = req.query.cb; 5 //设置cookie 6 res.cookie(wechat_userinfo_callback_url, cb); 7 var url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=" + appi

Swift - 使用EventKit获取系统日历事件,添加事件

通过EventKit可以对iOS日历事件进行读取,添加等操作.但网上找到的都是使用Objective-C来编写的. 下面提供一个Swift版的样例,演示如何添加一个事件以及获取所有的事件列表. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 imp