选择日历以添加 iOS 事件

Choosing Calendar to add an iOS event

我正在尝试将事件添加到 iOS 设备的日历中,现在我必须将事件添加到 defaultCalendarForNewEvents 日历中,但我想要的是能够选择一个已创建的日历,我想在其中添加事件。

例如,在下面的捕获中可以看到有一个 iphone 日历,然后可能创建了 1 个或多个 gmail

我想做的是你可以选择要在其中添加事件的日历,这个日历必须早点创建,不是系统选择日历.

有什么建议吗?有例子吗?

P.D:我开始使用 and

进行编码

添加事件的代码我正在测试并且它有效:

- (void) addEventCalendar: (Evento_DTO *) evento {
    EKEventStore *eventStore = [[EKEventStore alloc] init];
    EKEvent *event = [EKEvent eventWithEventStore:eventStore];
    EKReminder *reminder = [EKReminder reminderWithEventStore:eventStore];


    event.title = @"Test Event";
    reminder.title = @"Test reminder";

    NSDate *cDate = [NSDate date];
    NSLog(@"current date  %@", cDate);


    /*NSDateComponents *startDateComponents = [[[NSDateComponents alloc] init] autorelease];
     [startDateComponents setDay:12];
     [startDateComponents setMonth:12];
     [startDateComponents setYear:2012];
     [startDateComponents setHour:12];
     [startDateComponents setMinute:18];


     NSDateComponents *endDateComponents = [[[NSDateComponents alloc] init] autorelease];
     [endDateComponents setDay:12];
     [endDateComponents setMonth:12];
     [endDateComponents setYear:2012];
     [endDateComponents setHour:12];
     [endDateComponents setMinute:18];
     [endDateComponents setSecond:20];*/


    //event.startDate = cDate;
    //event.endDate = [cDate dateByAddingTimeInterval:15.0];

    event.startDate = [cDate dateByAddingTimeInterval:((5*60*60) + (30 * 60) + 15)];
    event.endDate = [cDate dateByAddingTimeInterval:((5*60*60) + (30 * 60) + 30)];


    //event.startDate = [[NSCalendar currentCalendar] dateFromComponents:startDateComponents];
    //event.endDate = [[NSCalendar currentCalendar] dateFromComponents:endDateComponents];

    reminder.completionDate = [cDate dateByAddingTimeInterval:((5*60*60) + (30 * 60) + 10)];

    NSLog(@"startdate  %@", event.startDate);
    NSLog(@"enddate  %@", event.endDate);


    [event setCalendar:[eventStore defaultCalendarForNewEvents]];

    //[reminder setCalendar:[eventStore defaultCalendarForNewReminders]];

    NSError *error = nil;

    [eventStore saveEvent:event span:EKSpanThisEvent commit:YES error:&error];
    //[eventStore saveReminder:reminder commit:YES error:&error];
}

通过创建新日历来试试这个。

 -(EKEvent*)createEvent:(EKEventStore*)eventStore{
        EKEvent *event = [EKEvent eventWithEventStore:eventStore];
        event.title = @"New Event";

        event.startDate = [NSDate date];
        event.endDate =[NSDate date];

        event.location=@"Location";
        event.allDay = YES;
        event.notes =@"Event description";

        NSString* calendarName = @"Calendar";
        EKCalendar* calendar;
        EKSource* localSource;
        for (EKSource *source in eventStore.sources){
            if (source.sourceType == EKSourceTypeCalDAV &&
                [source.title isEqualToString:@"iCloud"]){
                localSource = source;
                break;
            }
        }
        if (localSource == nil){
            for (EKSource *source in eventStore.sources){
                if (source.sourceType == EKSourceTypeLocal){
                    localSource = source;
                    break;
                }
            }
        }
        calendar = [EKCalendar calendarForEntityType:EKEntityTypeEvent eventStore:eventStore];
        calendar.source = localSource;
        calendar.title = calendarName;
        NSError* error;
        [eventStore saveCalendar:calendar commit:YES error:&error];
        return event;
}

希望它能奏效。 如果您有任何疑问,请告诉我。

-(void)addEventOnCalendar{
    EKEventStore *store = [EKEventStore new];
    [store requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError *error) {
        if (!granted) {
            return;
        }
        EKEvent *event = [EKEvent eventWithEventStore:store];
        event.title = @"What ever You want to save as your event";
        event.startDate = selectedDate;

        event.endDate = selectedDate1;

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

    }];
    UIAlertView *alert=[[UIAlertView alloc]initWithTitle:@"Message" message:@"Event Successfully added in Calender" delegate:self cancelButtonTitle:@"ok" otherButtonTitles:nil, nil];
    [alert show];
}

首先感谢@NarendraPandey 和@nehamishra 提供的帮助

我已经给出了我的问题的解决方案,我会把解决方案放上去,以便有人可以为您服务。

我创建了一个获取本地可用日历和gmail可用日历的方法,代码如下:

- (NSMutableArray*) getCalendars {

    NSMutableArray *res =[[NSMutableArray alloc] init];

    EKEventStore *eventStore = [[EKEventStore alloc] init];
    EKEntityType type = EKEntityTypeEvent;
    NSArray *calendars = [eventStore calendarsForEntityType: type];

    for ( EKCalendar *cal in calendars )
    {
        if (cal.type == EKCalendarTypeCalDAV || cal.type == EKCalendarTypeLocal  ){
            NSLog(@"cal nombre:- %@ ", cal.title);
            [res addObject: cal];

        }
    }

    return res;
}

然后显示日历列表以便用户可以 select 一个并在那里输入事件,我发现我必须使用 Action Sheet,尽管我已经看到它已被弃用根据Whosebug的一些论坛评论,所以我使用了UIAlertController,如下:

NSMutableArray* cals =  [self getCalendars];

if([cals count] > 0){//Comprobamos que existan calendarios

   UIAlertController *alert = [UIAlertController   alertControllerWithTitle:AMLocalizedString(@"calendar_dialog_info", @"")
          message:nil
          preferredStyle:UIAlertControllerStyleActionSheet];

   for ( EKCalendar *cal in cals )
   {
         UIAlertAction *calAction = [UIAlertAction actionWithTitle: cal.title
         style:UIAlertActionStyleDefault handler:^(UIAlertAction * action) {

         NSLog(@"You pressed button %@ ", cal.title);

         [self descargarCalendario:  cal];
          }];

          [alert addAction:calAction];
   }

   UIAlertAction* cancel = [UIAlertAction
                                         actionWithTitle:AMLocalizedString(@"cancelar", @"")
               style:UIAlertActionStyleCancel
               handler:^(UIAlertAction * action)
               {
                    [alert dismissViewControllerAnimated:YES completion:nil];

               }];

         [alert addAction:cancel];

         [self presentViewController:alert animated:YES completion:nil];
}else{
    NSLog(@"No hay calendarios");
}

其中 [self downloadCalendario: cal]; 函数负责从 Web 服务下载一些事件并将它们添加到所选日历。

选择日历时出现以下视图:

将事件添加到 selected 日历的代码是:

-(void)addEventOnCalendar: (EKCalendar *) cal{

    EKEventStore *store = [EKEventStore new];
    [store requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError *error) {
        if (!granted) {
            return;
        }
        EKEvent *event = [EKEvent eventWithEventStore:store];
        event.title = @"Test";

        NSDate *cDate = [NSDate date];
        event.startDate = [cDate dateByAddingTimeInterval:((5*60*60) + (30 * 60) + 15)];
        event.endDate = [cDate dateByAddingTimeInterval:((5*60*60) + (30 * 60) + 15)];

        //event.calendar = [store defaultCalendarForNewEvents];
        event.calendar = [store calendarWithIdentifier: cal.calendarIdentifier];

        NSError *err = nil;
        [store saveEvent:event span:EKSpanThisEvent commit:YES error:&err];

    }];
    UIAlertView *alert=[[UIAlertView alloc]initWithTitle:@"Message" message:@"Event Successfully added " delegate:self cancelButtonTitle:@"ok" otherButtonTitles:nil, nil];
    [alert show];

}

希望对大家有所帮助。