2013-06-08 4 views
0

내 응용 프로그램에 EventEditViewControllerWithEventStore보기를 가져 오는 단추가 있습니다. 사용자가 완료를 누르면 일정이 일정에 추가되고 일정이 추가되면 알림을 표시합니다. 그러나 사용자가 취소했는지 어떻게 알 수 있습니까? 현재로서는 사용자가 완료 또는 취소했는지 여부에 관계없이 알림이 표시됩니다.iOS : 사용자가 이벤트 킷의 "캘린더에 추가"를 취소 했습니까?

이것은 내가 지금까지 무엇을 가지고 :

- (IBAction)addEvent:(id)sender { 

    EKEventStore *eventStore = [[EKEventStore alloc] init]; 
    if([eventStore respondsToSelector: @selector(requestAccessToEntityType:completion:)]) { 

     [eventStore requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL permissionGranted, NSError *error) { 

      if (permissionGranted){ 

       NSLog(@"PERMISSION GRANTED."); 

       [self performSelectorOnMainThread:@selector(presentEventEditViewControllerWithEventStore:) withObject:eventStore waitUntilDone:NO]; 
      } 

      else { 

       NSLog(@"NO PERMISSION."); 

       [TSMessage showNotificationInViewController:self withTitle:@"Oops! Permission Required" withMessage:@"In order to use this feature, please enable calendar access for this app under settings." withType:TSMessageNotificationTypeWarning withDuration:TSMessageNotificationDurationAutomatic withCallback:nil atPosition:TSMessageNotificationPositionTop];  

      } 
     }]; 
    } 

    else { 

     // If device is > 6.0 
     [self presentEventEditViewControllerWithEventStore:eventStore]; 
    } 
} 

- (void)presentEventEditViewControllerWithEventStore:(EKEventStore*)eventStore 
{ 
    EKEventEditViewController *vc = [[EKEventEditViewController alloc] init]; 
    vc.eventStore = eventStore; 

    EKEvent* event = [EKEvent eventWithEventStore:eventStore]; 

    //Pre-populated Info 
    event.title = @"Event title"; 
    event.startDate = [NSDate date]; 
    event.endDate = [NSDate date]; 
    event.URL = [NSURL URLWithString:@"http://example.com"]; 
    event.notes = @"Event Notes Can Go Here."; 
    event.allDay = YES; 
    event.location = @"Earth"; 
    event.availability = EKEventAvailabilityTentative; 
    vc.event = event; 
    vc.editViewDelegate = self; 

    [self presentViewController:vc animated:YES completion:nil]; 
} 

#pragma EKEventEditViewDelegate 

- (void)eventEditViewController:(EKEventEditViewController*)controller 
      didCompleteWithAction:(EKEventEditViewAction)action { 


    [controller dismissViewControllerAnimated:YES completion:nil]; 

    [self performSelector:@selector(eventAddedSuccessfully) withObject:nil afterDelay:0.5]; 

} 

#pragma TSMessages 

- (void)eventAddedSuccessfully { 

    NSLog(@"Event was successfully added."); 


    [TSMessage showNotificationInViewController:self withTitle:@"Success!" withMessage:@"The event was added to your calendar." withType:TSMessageNotificationTypeSuccess withDuration:TSMessageNotificationDurationAutomatic withCallback:nil atPosition:TSMessageNotificationPositionTop]; 


} 

답변

1

그것을 잡을 수있는 다음과 같은 방법을 추가, 다음 EKEventEditViewControllerself에의 delegate 방법을 설정합니다.

#pragma mark - 
#pragma mark EKEventEditViewDelegate 

// Overriding EKEventEditViewDelegate method to update event store according to user actions. 
- (void)eventEditViewController:(EKEventEditViewController *)controller 
      didCompleteWithAction:(EKEventEditViewAction)action { 

    NSError *error = nil; 
    //EKEvent *thisEvent = controller.event; 

    switch (action) { 
     case EKEventEditViewActionCanceled: 
      // Edit action canceled, do nothing. 
      break; 

     case EKEventEditViewActionSaved: 
      // When user hit "Done" button, save the newly created event to the event store, 
      // and reload table view. 
      // If the new event is being added to the default calendar, then update its 
      // eventsList. 
      [controller.eventStore saveEvent:controller.event span:EKSpanThisEvent error:&error]; 
      break; 

     case EKEventEditViewActionDeleted: 
      // When deleting an event, remove the event from the event store, 
      // and reload table view. 
      // If deleting an event from the currenly default calendar, then update its 
      // eventsList. 
         break; 

     default: 
      break; 
    } 
    // Dismiss the modal view controller 
    [controller dismissViewControllerAnimated:YES completion:nil]; 


} 

또한, 다음과 같은 EKEventEditViewDelegate에 적합한에서 헤더 파일에 사용자 인터페이스를 확인하십시오

.H 파일

다음
@interface EventViewController : UIViewController <EKEventEditViewDelegate> {} 

가 어떻게 있는지 확인하는 것입니다 이벤트 추가/수정 권한이 부여되었습니다.

EKEventStore *store = [[EKEventStore alloc] init];  
if([store respondsToSelector:@selector(requestAccessToEntityType:completion:)]) { 
    [store requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError *error) { 
      //Access not granted------------- 
      if(!granted){ 

      } 

      //Access granted 
      }else{ 

      } 
    }]; 
} 
+0

완벽하게 감사드립니다. 나는 단지 하나의 빠른 질문이있다. 사용자가 캘린더에 액세스 할 수있는 권한을 앱에 제공하지 않은 경우 작업을 실행하고 싶습니다. 그러나 NSLog가 작동하는 경우에만 else {} 안에 넣을 때 아무런 문제가 발생하지 않습니다. – KingPolygon

+0

기꺼이 도와 드리겠습니다. 물론, 위의 편집을 참조하십시오! – kushyar

+0

편집 해 주셔서 고맙지 만 문제는 NSLog가 나타나면 else {} 문에서 나타납니다. 그러나 UIAlertView를 배치하면 트리거되지 않습니다. 왜 그런지 알아? else 문에서만, 아무 일도 일어나지 않습니다. – KingPolygon