2010-10-13 15 views

risposta

12

è assolutamente possibile creare il proprio calendario - il problema è che è necessario iOS 5:

EKEventStore* eventStore = [[EKEventStore alloc] init]; 
NSString* calendarName = @"My Cal"; 
EKCalendar* calendar; 

// Get the calendar source 
EKSource* localSource; 
for (EKSource* source in eventStore.sources) { 
    if (source.sourceType == EKSourceTypeLocal) 
    { 
     localSource = source; 
     break; 
    } 
} 

if (!localSource) 
    return; 

calendar = [EKCalendar calendarWithEventStore:eventStore]; 
calendar.source = localSource; 
calendar.title = calendarName; 

NSError* error; 
bool success= [eventStore saveCalendar:calendar commit:YES error:&error]; 
if (error != nil) 
{ 
    NSLog(error.description); 
    // TODO: error handling here 
} 
+0

Come verificherebbe se il calendario esistesse già? Non vorrei creare il calendario più e più volte per caso? – Slee

+0

Quando si crea il calendario, esiste una proprietà denominata calendarIdentifier che è un identificativo univoco. Memorizza quell'identificatore univoco (e anche l'identificatore dell'archivio eventi - assicurati che non sia cambiato) e controlla l'archivio degli eventi per vedere se esiste prima di crearlo. – kurtzmarc

+0

Ma ecco il trucco: trovo che se la mia app crea un calendario locale, l'utente non è in grado di eliminarlo in seguito. Sembra un insetto. – matt

2

Avete (o qualcun altro) progressi con l'aggiunta di un nuovo calendario?

Ho la stessa situazione. Posso aggiungere programmaticamente eventi al calendario predefinito perfettamente, ma vorrei aggiungerli a un nuovo calendario, in modo che non interferiscano con gli eventi esistenti degli utenti e possano essere facilmente eliminati/nascosti dall'utente invece di rimuovere tutti gli eventi manualmente.

Non è possibile impostare le proprietà per un nuovo oggetto EKCalendar. Sembra che tu possa assegnare solo uno exsiting come defaultCalendarForNewEvents a un oggetto EKCalendar.

Tuttavia, so che è possibile creare un nuovo calendario a livello di codice, perché ho visto l'app per iPhone farlo (senza uscire dall'app).

  • Potrebbe essere che usano una soluzione alternativa facendo qualche trucco con un file ICS esterno?
  • Forse è possibile farlo "iscrivendosi" a un file ICS locale (sul file system iPhone/app) generato, invece di un URL. Qualcuno ha qualche esperienza con questo?
+0

Questo potrebbe funzionare davvero !! Proverò questo ... – Marsson

+0

qualche progresso in merito a questo problema? – Buju

0

In questo modo è possibile verificare se il calendario è già presente con titolo specifico. Se non esiste, è possibile crearlo in modo programmatico.

dichiarare un tipo booleano variabile

BOOL doesExist=NO; 
    EKEventStore *eventStore=[[EKEventStore alloc] init]; 

    NSArray *calanders=[eventStore calendarsForEntityType:EKEntityTypeEvent]; 

    //Now Iterate through every calendar in the array and match its title 
    // with the title that you want to create 



for(EKCalendar calendar in calendars) 
    { 
     if([[calendar title] isEqualToString:@"youdesiredname"]) 
      { 
        doesExist=YES; 
      } 

    } 

// così ora verificare se la nostra variabile bool valore YES significa che un calendario con lo stesso nome/titolo già non exists.if quindi è possibile creare

if(!doesExist) 
    { 
     NSString* calendarName = @"DesiredCalendarName"; 
     EKCalendar* calendar; 


     EKSource* localSource; 
     for (EKSource* source in eventStore.sources) { 
     if (source.sourceType == EKSourceTypeLocal) 
     { 
     localSource = source; 
     break; 
     } 




    if (!localSource) 
     return; 

     calendar = [EKCalendar calendarWithEventStore:eventStore]; 
     calendar.source = localSource; 
     calendar.title = calendarName; 


     EKEvent *event = [EKEvent eventWithEventStore:eventStore]; 
     calendar = [eventStore calendarWithIdentifier:self.calendarIdentifier]; 
     event.calendar = calendar; 

     // Set the start date to the current date/time and the event duration to one hour 
     NSDate *startDate = [NSDate date]; 
     event.startDate = startDate; 
     event.endDate = [startDate dateByAddingTimeInterval:3600]; 

     //And to save the event to the event database: 

     NSError *error = nil; 
    BOOL result = [eventStore saveEvent:event span:EKSpanThisEvent commit:YES error:&error]; 
    if (result) 
    { 
    NSLog(@"Saved event to event store.") 
    } 
    else 
    { 
    NSLog(@"Error saving event: %@.", saveError); 
    } 

     NSError* error; 
     bool success= [eventStore saveCalendar:calendar commit:YES error:&error]; 
     if (error != nil) 
     { 
     NSLog(error.description); 

     } 

    } 
Problemi correlati