选择日历以添加 iOS 事件
Choosing Calendar to add an iOS event
我正在尝试将事件添加到 iOS 设备的日历中,现在我必须将事件添加到 defaultCalendarForNewEvents
日历中,但我想要的是能够选择一个已创建的日历,我想在其中添加事件。
例如,在下面的捕获中可以看到有一个 iphone 日历,然后可能创建了 1 个或多个 gmail
我想做的是你可以选择要在其中添加事件的日历,这个日历必须早点创建,不是系统选择日历.
有什么建议吗?有例子吗?
P.D:我开始使用 objective-c and ios
进行编码
添加事件的代码我正在测试并且它有效:
- (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];
}
希望对大家有所帮助。
我正在尝试将事件添加到 iOS 设备的日历中,现在我必须将事件添加到 defaultCalendarForNewEvents
日历中,但我想要的是能够选择一个已创建的日历,我想在其中添加事件。
例如,在下面的捕获中可以看到有一个 iphone 日历,然后可能创建了 1 个或多个 gmail
我想做的是你可以选择要在其中添加事件的日历,这个日历必须早点创建,不是系统选择日历.
有什么建议吗?有例子吗?
P.D:我开始使用 objective-c and ios
进行编码添加事件的代码我正在测试并且它有效:
- (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];
}
希望对大家有所帮助。