iOS 添加项目到系统日历
2017-11-17 本文已影响393人
淘码小工
仅打开系统日历程序
//calshow:后面加时间戳格式,也就是NSTimeInterval
// 注意这里计算时间戳调用的方法是-
// NSTimeInterval nowTimestamp = [[NSDate date] timeIntervalSinceDate:2016];
// timeIntervalSinceReferenceDate的参考时间是2000年1月1日,
// [NSDate date]是你希望跳到的日期。
直接写入日历项目
直接写入日历项目一般用于当前已知日历项目参数比较完整或要求比较明确。
这里需要导入EventKit/EventKit.h库
- (IBAction)saveEvent:(UIButton *)sender {
EKEventStore *eventStore = [[EKEventStore alloc] init];
//06.07 使用 requestAccessToEntityType:completion: 方法请求使用用户的日历数据库
if ([eventStore respondsToSelector:@selector(requestAccessToEntityType:completion:)])
{
// the selector is available, so we must be on iOS 6 or newer
[eventStore requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError *error) {
dispatch_async(dispatch_get_main_queue(), ^{
if (error)
{
//错误细心
// display error message here
}
else if (!granted)
{
//被用户拒绝,不允许访问日历
// display access denied error message here
}
else
{
// access granted
// ***** do the important stuff here *****
//事件保存到日历
//06.07 元素
//title(标题 NSString),
//location(位置NSString),
//startDate(开始时间 2016/06/07 11:14AM),
//endDate(结束时间 2016/06/07 11:14AM),
//addAlarm(提醒时间 2016/06/07 11:14AM),
//notes(备注类容NSString)
//创建事件
EKEvent *event = [EKEvent eventWithEventStore:eventStore];
event.title = @"测试写入日历事件";
event.location = @"北京海淀";
// NSDateFormatter *tempFormatter = [[NSDateFormatter alloc]init];
// [tempFormatter setDateFormat:@"dd.MM.yyyy HH:mm"];
//06.07 时间格式
NSDateFormatter * dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setAMSymbol:@"AM"];
[dateFormatter setPMSymbol:@"PM"];
[dateFormatter setDateFormat:@"yyyy/MM/dd hh:mmaaa"];
NSDate *date = [NSDate date];
NSString * s = [dateFormatter stringFromDate:date];
NSLog(@"%@",s);
//开始时间(必须传)
event.startDate = [date dateByAddingTimeInterval:60 * 2];
//结束时间(必须传)
event.endDate = [date dateByAddingTimeInterval:60 * 5 * 24];
// event.endDate = [[NSDate alloc]init];
// event.allDay = YES;//全天
//添加提醒
//第一次提醒 (几分钟后)
[event addAlarm:[EKAlarm alarmWithRelativeOffset:60.0f * -1.0f]];
//第二次提醒 ()
// [event addAlarm:[EKAlarm alarmWithRelativeOffset:60.0f * -10.0f * 24]];
//06.07 add 事件类容备注
NSString * str = @"接受信息类容备注";
event.notes = [NSString stringWithFormat:@"%@",str];
[event setCalendar:[eventStore defaultCalendarForNewEvents]];
NSError *err;
[eventStore saveEvent:event span:EKSpanThisEvent error:&err];
NSLog(@"保存成功");
//直接杀死进程
exit(2);
}
});
}];
}
}
使用系统原生界面创建日历
不同于Android系统, iOS创建日历项目无法直接跳转到日历程序进行创建,即不存在上述第一种方式传递参数实现的方法。 但我们可以使用系统提供的EventKitUI库,这个库包含了与系统日历创建日历项目相类似的界面供我们直接调用。
同时引入EventKit/EventKit.h 和 EventKitUI/EventKitUI.h 两个头文件。
// in you viewController
- (void)open_EKEventEditViewController:(NTNotesCell *)cell {
EKEventStore *eventStore = [[EKEventStore alloc]init];
if([eventStore respondsToSelector:@selector(requestAccessToEntityType:completion:)]) {
[eventStore requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted,NSError* error){
if(!granted){
dispatch_async(dispatch_get_main_queue(), ^{
//TODO: 提示需要权限
});
}else{
EKEvent *event = [EKEvent eventWithEventStore:eventStore];
event.title = @"日历标题";
EKCalendar* calendar;
calendar = [EKCalendar calendarForEntityType:EKEntityTypeEvent eventStore:eventStore];
NSError* error;
[eventStore saveCalendar:calendar commit:YES error:&error];
EKEventEditViewController *addController = [[EKEventEditViewController alloc] initWithNibName:nil bundle:nil];
addController.event = event;
addController.eventStore = eventStore;
[self presentViewController:addController animated:YES completion:nil];
addController.editViewDelegate = self;
}
}];
}
}
#pragma mark - eventEditDelegates -
- (void)eventEditViewController:(EKEventEditViewController *)controller didCompleteWithAction:(EKEventEditViewAction)action{
if (action ==EKEventEditViewActionCanceled) {
[self dismissViewControllerAnimated:YES completion:nil];
}
if (action==EKEventEditViewActionSaved) {
[self dismissViewControllerAnimated:YES completion:nil];
}
}