6

私はiOSプログラミングに不慣れで、特定の都市の休日を一覧表示し、ユーザーがそれらのイベントをiCalのデフォルトカレンダーに追加できるようにする簡単なプロジェクトに取り組んでいます。

問題は、ユーザーのカレンダーに同じプロパティ(タイトルや開始日など)を持つイベントがすでに存在するかどうかを確認する方法です。これは、アクションボタン(iCalにイベントを追加するために使用)が複数回押された場合に発生する可能性があります。このような状況では、iCalで2つ以上の同一のイベントが作成されることは望ましくありません。

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ループ中)で、返されたイベントに存在[allHolidayDates objectAtIndex:i]するかどうかを確認するためにループする配列を返すことに基づいてNSPredicateを作成する必要[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 に答える