6

我是 iOS 编程的新手,我正在开发一个简单的项目,该项目列出了给定城市的假期,并让用户能够将这些事件添加到 iCal 默认日历中。

问题是:如何检查用户日历中是否已经存在具有相同属性(例如标题和开始日期)的事件。如果多次按下操作按钮(用于向 iCal 添加事件),则可能会发生这种情况。在这种情况下,我不希望在 iCal 中创建两个或更多相同的事件。

我曾尝试使用 NSPredicate ,但我完全不知道如何对其进行排序。

任何帮助将不胜感激!提前致谢。

贝娄是我的事件添加代码,只是为了让事情变得清晰。在这种情况下,用户正在从列表中添加多个事件(例如所有当地节假日)。

for (int i = 0; i<[allHolidayNames count]; ++i) {

    // ------ EVENT MANIPULATION ------

    EKEventStore *eventStore = [[EKEventStore alloc] init];
    EKEvent *addEvent = [EKEvent eventWithEventStore:eventStore];
    addEvent.title = [allHolidayNames objectAtIndex:i];
    addEvent.startDate = [allHolidayDates objectAtIndex:i];
    addEvent.allDay = YES;
    [addEvent setCalendar:[eventStore defaultCalendarForNewEvents]];
    [eventStore saveEvent:addEvent span:EKSpanThisEvent commit:YES error:nil];
}   
4

1 回答 1

15

概括

在您的实例方法中的某个时刻(可能在 for 循环期间),您将希望创建一个 NSPredicate 基于[allHolidayDates objectAtIndex:i]返回一个数组,您循环通过该数组来检查[allHolidayNames objectAtIndex:i]返回的事件中是否存在。

示例代码

for (int i = 0; i<[allHolidayNames count]; ++i) {

    // ------ EVENT MANIPULATION ------

    EKEventStore *eventStore = [[EKEventStore alloc] init];

    NSPredicate *predicateForEventsOnHolidayDate = [eventStore predicateForEventsWithStartDate:[allHolidayDates objectAtIndex:i] endDate:[allHolidayDates objectAtIndex:i] calendars:nil]; // nil will search through all calendars

    NSArray *eventsOnHolidayDate = [eventStore eventsMatchingPredicate:predicateForEventsOnHolidayDate]

    BOOL eventExists = NO;

    for (EKEvent *eventToCheck in eventsOnHolidayDate) {
        if ([eventToCheck.title isEqualToString:[allHolidayNames objectAtIndex:i]]) {
            eventExists = YES;
        }
    }

    if (eventExists == NO) {
        EKEvent *addEvent = [EKEvent eventWithEventStore:eventStore];
        addEvent.title = [allHolidayNames objectAtIndex:i];
        addEvent.startDate = [allHolidayDates objectAtIndex:i];
        addEvent.allDay = YES;
        [addEvent setCalendar:[eventStore defaultCalendarForNewEvents]];
        [eventStore saveEvent:addEvent span:EKSpanThisEvent commit:YES error:nil];
    }
}

提示

  • 为了帮助可视化数据,尤其是数组和对象的内容,请尝试使用NSLog. 这会将对象的内容输出到控制台,以帮助您更好地理解数据结构。

    NSLog("eventsOnHolidayDate = %@",eventsOnHolidayDate);

  • 请注意,这eventsMatchingPredicate将在检索事件时阻塞主线程。如果您连续多次这样做,可能会影响用户体验。您应该考虑使用enumerateEventsMatchingPredicate:usingBlock:(在这个问题的范围之外)。

于 2012-02-18T11:49:46.220 回答