2016-03-25 11 views
2

私はすべてのストアイベントをフェッチするために私のアプリでEKEventを使用しています。特定のイベントを識別子で編集し、既存のものに再保存したいのですが、何をすべきですか?iOSでEKEventを更新または編集し、識別子を使ってネイティブカレンダーに保存する方法は?

EKEventStore *store = [EKEventStore new]; 
    EKEvent *event = [EKEvent eventWithEventStore:store]; 

    event.title = @"abc"; 
    event.notes= @"this is updated notes"; 

    event.calendar = [store defaultCalendarForNewEvents]; 
    NSError *err = nil; 

    [store saveEvent:event span:EKSpanThisEvent commit:YES error:&err]; 

このコードはイベントを保存するために使用していますが、特定のイベントのみを更新するための識別子を渡す場所はどこですか?

+0

適切な述部を使用してイベントをフェッチし、編集して保存する必要があります。 – vadian

+0

はい、私はデバイスからすべてのイベントを取得し、またそれの識別子を取得...しかし、今どこのイベントを編集するためにその識別子を渡す...と保存? –

+0

https://dpaste.de/sVJ9ここにあなたが言ったことのための私のコード –

答えて

2

ようにするには、データベース内のイベント識別子を保存する必要があります後でこのイベントを使用してイベントを更新または削除することができます。イベントの作成後:

[store saveEvent:event span:EKSpanThisEvent commit:YES error:&err]; 

event.eventIdentifierにアクセスできます。データベースに保存します。特定のイベントを編集する場合は、保存されているIDを使用してそのイベントを取得してください:

-(void)updateNotification:(NSMutableDictionary *) info 
{ 
    EKEventStore *eventStore = [[EKEventStore alloc] init]; 
    [eventStore requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError *error) 
    { 
     if (!granted) 
     { 
      dispatch_async(dispatch_get_main_queue(), ^{ 

       UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Cannot access Calendar" message:@"Please give the permission to add task in calendar from iOS > Settings > Privacy > Calendars" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles: nil]; 
       [alert show]; 

      }); 
      return; 
     } 

     if (error) 
     { 
      NSLog(@"%@", error); 
     } 

     //this is event ID you saved in DB. now you want to edit that event 
     EKEvent *event = [eventStore eventWithIdentifier:info[@"eventID"]]; 

     if(event) { 

//You have your valid event. Modify as per your need. 

      event.title  = [info valueForKey:@"title"]; 
      event.notes  = [info valueForKey:@"description"]; 
      event.startDate = [info objectForKey:@"date"]; 
      event.endDate = [[NSDate alloc] initWithTimeInterval:3600*24 sinceDate:event.startDate]; 
      event.calendar = eventStore.defaultCalendarForNewEvents; 

      [eventStore saveEvent:event span:EKSpanThisEvent commit:YES error:&error]; 

     } 

    }]; 
} 

希望します。お気軽に質問してください。

+0

info [@ "eventID"]このイベントIDには、eventidentifierを使用する必要があります、eventIdentifier、eventStoreIdentifier、calendarItemIdentifierなぜなら、私はあなたのソリューションで試したコードです。http://dpaste.com/2G7VNBH –

+1

'event.eventIdentifier' - 一意のIDを保持しているためですイベントのために。 'eventStoreIdentifier'はイベントストアの識別子であり、' calendarItemIdentifier'は複数のデバイスにアクセスするために使われます。私は 'event.eventIdentifier'を使用しており、正常に動作します。 – NightFury

+0

まだ変化がない:-( –

0

これは、すべてのイベントを取得するためのコードです。 Ref。 アップルのデモプロジェクト

- (NSMutableArray *)fetchEvents{ 

NSDate *startDate = [NSDate date]; 

//Create the end date components 
NSDateComponents *tomorrowDateComponents = [[NSDateComponents alloc] init]; 
tomorrowDateComponents.day = 1; 

NSDate *endDate = [[NSCalendar currentCalendar] dateByAddingComponents:tomorrowDateComponents 
                   toDate:startDate 
                   options:0]; 
// We will only search the default calendar for our events 
NSArray *calendarArray = @[self.defaultCalendar]; 

// Create the predicate 
NSPredicate *predicate = [self.eventStore predicateForEventsWithStartDate:startDate 
                    endDate:endDate 
                   calendars:calendarArray]; 

// Fetch all events that match the predicate 
NSMutableArray *events = [NSMutableArray arrayWithArray:[self.eventStore eventsMatchingPredicate:predicate]]; 

return events; 

}

は、デモプロジェクト参照してください。 - >EkEvent demo

をそしてこのalso-を参照してください>Document

+0

すべてのイベントロジックを取得したくない...すでに完了しました...そのイベントを編集したいだけです –

-1
func editOneEventToCalendar(id:String,title: String, description: String?,alarams :[EKAlarm],location:String,contacts:[EKParticipant],repeatString :String,timeZone:NSTimeZone, startDate: NSDate, endDate: NSDate , isAllDay :Bool ,calendar:EKCalendar,StruLocation:EKStructuredLocation?) -> Bool{ 
    let eventStore = EventsManager.getEventStore() 



    let event = EventsManager.geteventID(id: id) 
    event.title = title 
    event.startDate = startDate as Date 
    event.endDate = endDate as Date 
    event.notes = description 
    event.calendar = calendar 

    event.timeZone = timeZone as TimeZone //NSTimeZone() as TimeZone //timeZone as TimeZone 

    if StruLocation != nil { 
     event.structuredLocation = StruLocation 
    }else { 

     event.structuredLocation = StruLocation 
    } 

    event.isAllDay = isAllDay 

    if repeatString != "None" { 

     let rule = EventsManager.getRepeatValue(repeatString)//self.getRepeatValue(option: repeat) 
     event.addRecurrenceRule(rule!) 
    }else if repeatString == "None"{ 


     if event.hasRecurrenceRules { 


      let rrrl = event.recurrenceRules 

      for i in rrrl! { 


       event.removeRecurrenceRule(i) 

      } 

     } 


    } 




    for item in alarams { 

     event.addAlarm(item) 
    } 

    //  let formatter = CNContactFormatter() 
    //  formatter.style = 
    var attendees = [EKParticipant]() 
    //  for item in contacts { 
    // 
    //   let con = event.(contact: item) 
    //   attendees.append(con!) 
    // 
    //  } 



    do { 

     try eventStore.save(event, span: .thisEvent, commit: true) 

     //try eventStore.save(event, span: .thisEvent) 

     // if saved edit the local db ?? 


     return true 

    } catch let e as NSError { 


     EZAlertController.alert(e.debugDescription) 


    } 


    return false 

} 



    func editFutureEventToCalendar(id:String,title: String, description: String?,alarams :[EKAlarm],location:String,contacts:[EKParticipant],repeatString :String,timeZone:NSTimeZone, startDate: NSDate, endDate: NSDate , isAllDay :Bool,calendar:EKCalendar,StruLocation:EKStructuredLocation?)->Bool { 
    let eventStore = EventsManager.getEventStore() 



    let event = EventsManager.geteventID(id: id) 

    let ocdate = event.occurrenceDate 

    event.title = title 
    event.startDate = startDate as Date 
    event.endDate = endDate as Date 
    event.notes = description 
    event.calendar = calendar 
    // event.occurrenceDate = ocdate 


    event.timeZone = timeZone as TimeZone //timezoneNSTimeZone() as TimeZone //timeZone as TimeZone 


    event.isAllDay = isAllDay 

    if StruLocation != nil { 
     event.structuredLocation = StruLocation 
    }else { 

     event.structuredLocation = StruLocation 
    } 


    if repeatString != "None" { 

     if event.hasRecurrenceRules { 


      let rrrl = event.recurrenceRules 

      for i in rrrl! { 


       event.removeRecurrenceRule(i) 

      } 

     } 


     let rule = EventsManager.getRepeatValue(repeatString)//self.getRepeatValue(option: repeat) 
     event.addRecurrenceRule(rule!) 
    }else if repeatString == "None"{ 


     if event.hasRecurrenceRules { 


      let rrrl = event.recurrenceRules 

      for i in rrrl! { 


       event.removeRecurrenceRule(i) 

      } 

     } 


    } 






    for item in alarams { 

     event.addAlarm(item) 
    } 
    // event.location = location 
    //  let formatter = CNContactFormatter() 
    //  formatter.style = 
    var attendees = [EKParticipant]() 
    //  for item in contacts { 
    // 
    //   let con = event.(contact: item) 
    //   attendees.append(con!) 
    // 
    //  } 



    do { 

     try eventStore.save(event, span: .futureEvents, commit: true) 

     //try eventStore.save(event, span: .thisEvent) 

     return true 

    } catch let e as NSError { 


     EZAlertController.alert(e.debugDescription) 
    } 



    return false 
} 
関連する問題