2016-11-16 68 views
1

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

例如在下面的拍摄可以看出,有一个iPhone的日历,然后可能有1个或几个Gmail的创建

introducir la descripción de la imagen aquí

我想要做的是,你可以选择要在其中添加事件的日历,必须先创建此日历,而不是系统选择日历。

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

Pd积:我开始代码

代码来添加我测试的事件和它的工作原理:

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

回答

2

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

} 

我希望它可以帮助别人。

1

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

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

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

     [email protected]"Location"; 
     event.allDay = YES; 
     event.notes [email protected]"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

非常感谢你,我会试试看看它是否适合我,我会告诉你它是否为我服务 – Joacer

+1

我尝试你的代码并且很好地创建一个新的日历,但我希望能够选择一个已经创建的日历,并在该日历中添加事件,也许我对问题的描述不清楚,或引起混淆,现在我将编辑它 – Joacer

+0

是在第二个屏幕截图中,您可以看到。您可以从可用日历中选择日历。 –

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]; 
} 
+0

谢谢你你的答案 – Joacer