ios - 检查日历上是否存在事件

标签 ios objective-c ekeventstore

我无法验证某个事件是否已存在于用户的日历中。我需要检查它以确定是否应该添加它,这样我就不会创建重复的日历条目。现在,我每次运行代码时都会创建一个重复的条目。

首先,这是我创建日历条目的方式:

+ (NSString *) addEventToCalenderWithDate : (NSDate *) eventDate
                               eventTitle : (NSString *) eventTitle
                            eventLocation : (NSString *) eventLocation
                              allDayEvent : (BOOL) isAllDay
{
    EKEventStore *store = [[EKEventStore alloc] init];

[store requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError *error) {

    if (!granted) {

        returnValue = @"calendar error";

    }

    else if ([self eventExists:dateAndTime eventTitle:eventTitle allDayEvent:isAllDay]) {

        returnValue = @"duplicate";

    }

    else {

        EKEvent *event = [EKEvent eventWithEventStore:store];
        event.title = eventTitle;

        event.startDate = dateAndTime;

        if (eventTimeString == (id)[NSNull null] || eventTimeString.length == 0 || isAllDay) {
            event.allDay = YES;
            event.endDate = dateAndTime;
        } else {
            event.endDate = [event.startDate dateByAddingTimeInterval:60*60];  //set 1 hour meeting
        }

        event.location = eventLocation;
        [event setCalendar:[store defaultCalendarForNewEvents]];
        NSError *err = nil;
        [store saveEvent:event span:EKSpanThisEvent commit:YES error:&err];

        returnValue = @"success";
    }
}];

return returnValue;


}

这会正确设置事件。但是,如果我再次运行它,我希望 else if 子句将返回 YES 并且不会创建新条目。但是,它始终返回 NO 并且我在每次执行时创建一个新的日历条目。这是该方法:

+ (BOOL) eventExists : (NSDate *) date
          eventTitle : (NSString *) eventTitle
         allDayEvent : (BOOL) isAllDay
{
    EKEventStore *store = [[EKEventStore alloc] init];

    NSPredicate *predicateForEventOnDate = [[NSPredicate alloc] init];

    if (isAllDay)
        predicateForEventOnDate = [store predicateForEventsWithStartDate:date endDate:date calendars:nil]; // nil will search through all calendars
    else
        predicateForEventOnDate = [store predicateForEventsWithStartDate:date endDate:[date dateByAddingTimeInterval:60*60] calendars:nil]; // nil will search through all calendars

    NSArray *eventOnDate = [store eventsMatchingPredicate:predicateForEventOnDate];
    NSLog(@"eventOnDate: %@", eventOnDate);

    BOOL eventExists = NO;

    for (EKEvent *eventToCheck in eventOnDate) {
        if ([eventToCheck.title isEqualToString:eventTitle]) {
            eventExists = YES;
        }
    }

    return eventExists;
}

当我逐步执行此方法时,我注意到名为 eventOnDateNSArraynil(EKEventStore不是 nil)。我不知道这是否意味着它根本没有找到任何匹配的事件,或者是否正在发生其他事情。

我做错了什么不允许它识别日历上的现有事件?谢谢!

最佳答案

问题似乎与您为谓词选择的日期范围有关。

predicateForEventOnDate = [store predicateForEventsWithStartDate:date endDate:date calendars:nil];

这将查找“0”秒范围内的事件,因为您的谓词查询的开始和结束日期是相同的。

predicateForEventOnDate = [store predicateForEventsWithStartDate:date endDate:[date dateByAddingTimeInterval:60*60] calendars:nil];

这只会查找在所提供日期后一小时内发生的事件。

NSCalendar *const calendar = NSCalendar.currentCalendar;
NSCalendarUnit const preservedComponents = (NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay);

//strip away hours, minutes and seconds to find date - at start of day
NSDateComponents *startComponents = [calendar components:preservedComponents fromDate:self.date];
//set finished date to 1 full day later
NSDateComponents *offset = [[NSDateComponents alloc] init];
[offset setDay:1];

NSDate *start = [calendar dateFromComponents:startComponents];
NSDate *finish = [calendar dateByAddingComponents:offset toDate:self.date options:0];

NSPredicate *predicateForEventOnDate = [[NSPredicate alloc] init];

if (isAllDay)
    predicateForEventOnDate = [store predicateForEventsWithStartDate:start endDate:finish calendars:nil];

NSArray *eventOnDate = [store eventsMatchingPredicate:predicateForEventOnDate];

这将生成一个数组,涵盖从开始到结束的一整天的事件。

关于ios - 检查日历上是否存在事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35140105/

相关文章:

ios - defaultCalendarForNewEvents 被定义为可选的,但是不能使用可选绑定(bind)来检查它是否为 nil

ios - 如何在ios中使用nsmutableurlrequest发送递归json请求?

ios - NSArrayM 插入对象 :atIndex:]: object cannot be nil'

ios - 获取包含参数的 Realm 对象

ios - 处理 EKEventStoreChangedNotification 通知

iphone - 在 iPhone 中将事件添加到默认日历时出错

ios - UITableView按钮图像在滚动时消失

iphone - 从主屏幕启动应用程序无法获取远程推送负载?但是从通知中心启动是有效的

iPhone:向用户显示简单警告/警报消息的内置方式

objective-c - setImage 动画 - NSImageView