简体   繁体   English

使用EKEventEditViewController创建带闹钟的日历事件

[英]Creating a calendar event with an alarm using EKEventEditViewController

I'm using the following code to create an event, and display a popup asking the user to save the event: 我正在使用以下代码创建一个事件,并显示一个弹出窗口,要求用户保存该事件:

EKEventStore *eventStore = [[EKEventStore alloc] init];
EKCalendar *calendar = [eventStore defaultCalendarForNewEvents];
EKEvent *event = [EKEvent eventWithEventStore:eventStore];
event.calendar = calendar;
event.title = [NSString stringWithFormat:@"Event: %@", [self.event title]]; 
event.location = self.event.location;
event.notes = [self stringByStrippingHTML: [self.event description]];
event.startDate = [self.event startDate]; 
event.endDate = [self.event endDate];

NSTimeInterval alarmOffset = -1*60*60;//1 hour
EKAlarm *alarm = [EKAlarm alarmWithRelativeOffset:alarmOffset];

[event addAlarm:alarm];
EKEventEditViewController *eventViewController = [[EKEventEditViewController alloc] init];
eventViewController.event = event;
eventViewController.eventStore=eventStore;
eventViewController.editViewDelegate = self;
[self.navigationController presentModalViewController:eventViewController animated:YES];

This works fine except the event alarm property doesn't get set as you can see form the image below: 这工作正常,除了事件警报属性没有设置,你可以看到从下面的图像:

警报未设置

If I save the event before showing the view controller it does get the alarm set. 如果我在显示视图控制器之前保存事件,它确实会设置警报。

Please note I'm using the LLVM compiler, so don't worry about not releasing stuff! 请注意我正在使用LLVM编译器,所以不要担心不发布内容!

Ta

Ross 罗斯

NSTimeInterval alarmOffset = -1*60*60;//1 hour
EKAlarm *alarm = [EKAlarm alarmWithRelativeOffset:alarmOffset];

[event addAlarm:alarm];

Write the above code after presenting the controller ie after the line 在呈现控制器之后,即在线之后写下面的代码

[self.navigationController presentModalViewController:eventViewController animated:YES];

Finally found out how to do it. 终于找到了怎么做。

Your controller would have to implement the protocol UINavigationControllerDelegate, and set the EKEventEditViewController delegate to self. 您的控制器必须实现协议UINavigationControllerDelegate,并将EKEventEditViewController委托设置为self。 Then just implement the 然后就实现了

navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated

method and add the alarm there. 方法并在那里添加警报。

Here is my implementation. 这是我的实施。

- (void)navigationController:(UINavigationController *)navigationController 
  willShowViewController:(UIViewController *)viewController animated:(BOOL)animated {

    if ([navigationController isKindOfClass:[EKEventEditViewController class]]) {
      EKEventEditViewController *ek = (EKEventEditViewController*)navigationController;
      EKEvent *event = ek.event;
      // set alarm to 15 mins prior of the event if it starts later than 15 mins out
      if ([event.startDate compare:[[NSDate date] dateByAddingTimeInterval:60*15]] != NSOrderedAscending) { 
        EKAlarm *alarm = [EKAlarm alarmWithRelativeOffset:60*15*-1];
        event.alarms = [NSArray arrayWithObject:alarm];
      }    
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM