2016-11-16 6 views
1

Я пытаюсь добавить события в календарь на устройствах iOS, теперь мне нужно добавить событие в календарь , но я хочу, чтобы вы могли выбрать календарь, который уже был создан, в который я хочу добавить событие.Выбор календаря для добавления события iOS

Например, в следующем захвате видно, что есть календарь iphone, а затем может быть один или несколько 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]; 
} 

ответ

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

Затем, чтобы показать список календарей, так что пользователь может выбрать один и ввести события там, я обнаружил, что Ihave использовать 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"); 
} 

ГдеФункцияотвечает за загрузку некоторых событий из веб-службы и добавление их в выбранный календарь.

В результате в следующем виде, чтобы выбрать календарь:

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

Смежные вопросы