ios - 无法在 iOS 6 中保存 EKReminder

标签 ios objective-c eventkit

我正在尝试从我的应用程序中保存/检索提醒,但出于某种原因,EKReminder 似乎没有被保存。这是我的代码:

EKEventStore * _eventStore = [[EKEventStore alloc] init];
[_eventStore requestAccessToEntityType:EKEntityTypeReminder completion:^(BOOL granted, NSError *error) {

    //create a new calendar for reminders.
    EKCalendar *calendar = [EKCalendar calendarForEntityType:EKEntityTypeReminder eventStore:_eventStore];
    EKSource *localSource = nil;
    for (EKSource *source in _eventStore.sources)
        if (source.sourceType == EKSourceTypeLocal)
        {
            localSource = source;
            break;
        }

    calendar.source = localSource;

    self.calendarIdentifier = calendar.calendarIdentifier;
    EKReminder *reminder = [EKReminder reminderWithEventStore:_eventStore];
    reminder.calendar = calendar;
    reminder.title = @"Test Reminder";
    reminder.startDateComponents = [[NSCalendar currentCalendar] components:NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit fromDate:[NSDate date]];
    reminder.completionDate = [NSDate dateWithTimeIntervalSinceNow:100];

    EKAlarm *alarm = [EKAlarm alarmWithAbsoluteDate:[NSDate dateWithTimeIntervalSinceNow:100]];
    reminder.alarms = @[alarm];      

    NSError *errorOb = nil;
    BOOL saved = [_eventStore saveReminder:reminder commit:YES error:&errorOb];
    if (saved) NSLog(@"Saved Reminder");
    else NSLog(@"Failed to save reminder");

}];

稍后,我会尝试验证提醒是否确实已保存。我使用这段代码来做到这一点:

NSPredicate *predicate = [_eventStore predicateForRemindersInCalendars:nil];
[_eventStore fetchRemindersMatchingPredicate:predicate completion:^(NSArray *reminders) {
    for (EKReminder *reminder in reminders) {
        NSLog(@"Reminder Title: %@", reminder.title);
    }
}];

我的新提醒永远不会出现!

谁能告诉我我做错了什么??

最佳答案

如果授权状态为 EKAuthorizationStatusNotDetermined,您只需调用 -requestAccessToEntityType:completion:。您可以使用 +[EKEventStore authorizationStatusForEntityType:] 检查授权状态。

完成 block 只会在您第一次调用 -requestAccessToEntityType:completion 时被调用。在模拟器上它甚至不会被调用一次,因为在模拟器上您的应用程序已经可以访问了。

EKEventStore * _eventStore = [[EKEventStore alloc] init];
EKAuthorizationStatus authorizationStatus = [EKEventStore authorizationStatusForEntityType:EKEntityTypeReminder];
if (authorizationStatus == EKAuthorizationStatusNotDetermined) {
    [_eventStore requestAccessToEntityType:EKEntityTypeReminder completion:^(BOOL granted, NSError *error) {
        if (granted) {
            [self createNewReminder];
        } else {
            [self showNowAccessAlert];
        }
    }];
} else {
    if (authorizationStatus == EKAuthorizationStatusAuthorized) {
        [self createNewReminder];
    } else {
        [self showNowAccessAlert];
    }
}

关于ios - 无法在 iOS 6 中保存 EKReminder,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15237014/

相关文章:

ios - 我可以在 EventKit 中添加/订阅日历吗?

objective-c - NSString 解析以查找日期

html - 使用自定义渲染器的本地 HTML 到 PDF 仅添加最近查看的图像

ios - 查找选定的 MapKit Annotation 的 postID

objective-c - 隐藏来自预编译库的 NSLog 输出

ios - 带有图像的 UIBarButtonItem 不显示

swift - 使用 iOS 中的事件填充 tableView (swift)

ios - iOS AWS v2 S3 Transfer Manager必须使用指定的端点

android - 在react-native中裁剪后的图像非常小

objective-c - Objective-C ,如何使事件 View 出现在顶部通知菜单上