iOS 写入日历

本文介绍了一种在iOS应用中实现日历事件创建及更新功能的方法。具体包括请求系统权限、查找已存在事件、创建新事件以及展示编辑界面等步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

      leader太忙了,需求的效果图来不急出。于是我们开发上。leader给出功能。开发们各自承包不同功能的效果图。先手绘,在借助软件让效果图动起来。开会讨论,可圈可点,忙的不亦乐乎。

     我承包的效果图,有提醒功能,于是乎借鉴了苏宁上的写入日历,提醒用户。好处是,不局限于网络,借助系统实现提醒功能,稳定可靠。通过大会后,并认可,并新增了对已写入日历的信息追加功能等细节。

    需求定后,开始开发,现已提测。系统的日历功能,实现如下:

//事件源self.eventStore,全局的

    //请求权限

    [self.eventStore requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError * _Nullable error) {

        dispatch_async(dispatch_get_main_queue(), ^{

            if (error) {

                CRMLog(@"error = %@",error.description);

            } else {

                //查找已存在的日历事件

                EKEvent * event = [self productEventInSystemCalendarBasedDictionary:dictionary];

                if (event) {

                    //向已存在的日历事件中追加notes

                    event.notes = [NSString stringWithFormat:@"%@\n%@",event.notes,@“xxx”];

                } else {

                    //创建新的日历事件

                    event = [self newEventsWithDictionary:dictionary];

                }

                //只有日历事件编辑的界面,当有权限时,展示的是编辑界面,当无权限时,展示的是无权限页。系统EKEventEditViewController实现的,很方便。

                self.editVC = [[EKEventEditViewController alloc] init];

                self.editVC.editViewDelegate = self;

                self.editVC.eventStore = self.eventStore;

                self.editVC.event = event;

                //用present 的方法展示出

               [self presentViewController:self.editVC animated:NO completion:nil];


               //有预览+编辑两个界面

                /*

                EKEventViewController * eventController = [[EKEventViewController alloc] init];

                eventController.title = @"写日历";

                eventController.event = event;

                eventController.allowsEditing = YES;

                eventController.allowsCalendarPreview = YES;

                eventController.delegate = self;


                navigationController = [[UINavigationController alloc] initWithRootViewController:eventController];

                 [self presentViewController:navigationController animated:YES completion:nil];

                 */


            }

        });

    }];


//已存在的日历事件

- (EKEvent *)productEventInSystemCalendarBasedDictionary:(NSDictionary *)dictionary {

    NSArray * tempA = [self.eventStore calendarsForEntityType:EKEntityTypeEvent];

    NSDateFormatter * dateFormatter = [[NSDateFormatter alloc] init];

    [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];

    NSDate * startDate = [dateFormatter dateFromString:[dictionary objectForKey:@"time"]];

    NSDate * endDate = [startDate dateByAddingTimeInterval:60 * 60 * 24 * 3];

    NSPredicate * predicate = [self.eventStore predicateForEventsWithStartDate:startDate endDate:endDate calendars:tempA];

    NSArray * eventArray = [self.eventStore eventsMatchingPredicate:predicate];


    NSString * eventTitle = [NSString stringWithFormat:@"%@",[dictionary objectForKey:@"name"]];

    for (EKEvent * eventObject in eventArray) {

        if ([eventObject.title isEqualToString:eventTitle]) {

            return eventObject;

        }

    }

    return nil;

}


//新的日历事件

- (EKEvent *)newEventsWithDictionary:(NSDictionary *)dictionary {

    EKEvent * event = [EKEvent eventWithEventStore:self.eventStore];

    event.title = [NSString stringWithFormat:@"%@",[dictionary objectForKey:@"name"]];

    //开始时间(必须传)

    NSDateFormatter * dateFormatter = [[NSDateFormatter alloc] init];

    [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];

    event.startDate = [dateFormatter dateFromString:[dictionary objectForKey:@"time"]];

    //结束时间(必须传)

    event.endDate = event.startDate;

    event.allDay = YES;

    //添加提醒

    //相对于当天12am。此处设置的是1天前上午9点提醒

    [event addAlarm:[EKAlarm alarmWithRelativeOffset:(-60*60*15)]];

    event.notes = @“xxxxx”;

    [event setCalendar:[self.eventStore defaultCalendarForNewEvents]];


    return event;

}

 

#pragma mark -EKEventEditViewDelegate


- (void)eventEditViewController:(EKEventEditViewController *)controller didCompleteWithAction:(EKEventEditViewAction)action {

    [viewC dismissViewControllerAnimated:YES completion:nil];

}

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值