选择日历以添加iOS事件

时间:2016-11-16 09:23:08

标签: ios objective-c calendar google-calendar-api

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

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

introducir la descripción de la imagen aquí

我想要做的是您可以选择要添加活动的日历,必须提前创建此日历,而不是系统选择日历。

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

P.D:我开始使用

进行编码

添加我正在测试的事件的代码,它可以运行:

- (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];
}

3 个答案:

答案 0 :(得分:1)

通过创建新日历来尝试此操作。

 -(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;
}

enter image description here

enter image description here

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

答案 1 :(得分:1)

-(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];
}

答案 2 :(得分:1)

首先,感谢@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;
}

然后为了显示日历列表以便用户可以选择一个日历并在那里输入事件,我发现我已经使用了Action Sheet,虽然我已经看到根据某些论坛评论它已被弃用StackOverflow,所以我使用了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服务下载某些事件并将其添加到所选日历中。

导致以下视图选择日历:

enter image description here

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

-(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];

}

我希望它有所帮助。