1

次のコードが機能しない理由がわからないようです。「CalendarCreated」と「CalendarExisted」のNSlogを取得します。CalendarIDも問題なく取得します。作成したカレンダーの束(10個など)がある時点で「表示」されましたが、試行を続けて削除したため、表示されません。なぜそれが機能しないのか、私は本当に混乱しています。

-(void)saveEventWithDate:(NSDate *)startDate endDate:(NSDate *)endDate {
    AppData *theData = [self theAppData];

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

    if([self checkIsDeviceVersionHigherThanRequiredVersion:@"6.0"]) {
        [eventStore requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError *error) {

            if (granted){

                EKEvent *event  = [EKEvent eventWithEventStore:eventStore];

                NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

                if ([defaults objectForKey:@"Calendar"] == nil) // Create Calendar if Needed
                {
                    EKSource *theSource = nil;

                    for (EKSource *source in eventStore.sources) {
                        if (source.sourceType == EKSourceTypeCalDAV && [source.title isEqualToString:@"iCloud"]) {
                            theSource = source;
                            NSLog(@"iCloud Store Source");
                            break;
                        } else {
                            for (EKSource *source in eventStore.sources) {
                                if (source.sourceType == EKSourceTypeLocal) {
                                    theSource = source;
                                    NSLog(@"iPhone Local Store Source");
                                    break;
                                }
                            }
                        }
                    }

                    EKCalendar *cal;
                    cal = [EKCalendar calendarWithEventStore:eventStore];
                    cal.title = @"hello";
                    cal.source = theSource;
                    [eventStore saveCalendar:cal commit:YES error:nil];
                    NSLog(@"cal id = %@", cal.calendarIdentifier);
                    NSString *calendar_id = cal.calendarIdentifier;
                    [defaults setObject:calendar_id forKey:@"Calendar"];
                    event.calendar  = cal;

                } else {
                    event.calendar  = [eventStore calendarWithIdentifier:[defaults objectForKey:@"Calendar"]];
                    NSLog(@"Calendar Existed");
                }

                event.title     = [NSString stringWithFormat:@"%@ iPhone",[theData.repair_info objectForKey:@"name"]];
                event.location  = @"Location of";
                event.notes     = @"Notes";
                event.startDate = startDate;
                event.endDate   = endDate;
                event.allDay    = NO;
                EKAlarm *alarm = [EKAlarm alarmWithRelativeOffset:-1800]; // Half Hour Before
                event.alarms = [NSArray arrayWithObject:alarm];

                [eventStore saveEvent:event span:EKSpanThisEvent error:nil];

            } else {
                NSLog(@"Not Granted");
            }

        }];
    } }
4

3 に答える 3

2

ユーザーがカレンダーを削除した場合は、設定の下に[カレンダーのリセット]ボタンは必要ないと思います。コード行を次の場所から変更するだけです。

if ([defaults objectForKey:@"Calendar"] == nil) // Create Calendar if Needed

if ([defaults objectForKey:@"Calendar"] == nil || ![eventStore calendarWithIdentifier:[defaults objectForKey:@"Calendar"]]) // Create Calendar if Needed

新しいカレンダーを作成し、それに新しいイベントを追加します

于 2013-04-17T08:19:43.490 に答える
1

問題はコードの最初の行にあります。

//Wrong Way..
EKEventStore *eventStore = [[EKEventStore alloc] init];

EKEventStoreの別のインスタンスを作成し、既存のインスタンスでトランザクションを実行したいとします。

ここで「allocinit」する代わりに、カレンダーのデータソースを管理しているクラスからEKEventStoreインスタンスをフェッチします。のように見えるかもしれません。

EKEventStore *eventStore = [dataSource getEventSore];

また、カレンダーのIDを追跡する代わりに。EKEventの識別子を追跡することをお勧めします。

EKEvent *event  = [EKEvent eventWithEventStore:eventStore];
NSLog(@"eventIdentifier = %@",event.eventIdentifier);
于 2012-10-30T13:43:42.023 に答える
0

問題は、ユーザーのデフォルトが作成された(その後削除された)最初のカレンダーに設定されていたため、別のカレンダーが作成されないことでした。NSUserDefaultsをクリアする必要があり、カレンダーが作成されました。そのため、ユーザーがカレンダーを削除した場合は、設定の下に[カレンダーのリセット]ボタンが必要になります。

于 2012-10-03T17:13:48.370 に答える