iOS开发:事件、提醒与联系人数据处理
立即解锁
发布时间: 2025-08-25 01:32:33 阅读量: 2 订阅数: 16 


iOS 6开发实战指南:从入门到精通
# iOS开发:事件、提醒与联系人数据处理
## 1. 创建循环事件
在处理日历事件时,Event Kit框架提供了强大的API来创建循环事件。以下是创建循环事件的示例代码:
```objc
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
if (buttonIndex == 1)
{
// OK button tapped
// Calculate the date exactly one day from now
NSCalendar *calendar = [NSCalendar currentCalendar];
NSDateComponents *aDayFromNowComponents = [[NSDateComponents alloc] init];
aDayFromNowComponents.day = 1;
NSDate *now = [NSDate date];
NSDate *aDayFromNow = [calendar dateByAddingComponents:aDayFromNowComponents
toDate:now options:0];
// Create the event
EKEvent *event = [EKEvent eventWithEventStore:self.eventStore];
event.title = [alertView textFieldAtIndex:0].text;
event.calendar = [self.eventStore defaultCalendarForNewEvents];
event.startDate = aDayFromNow;
event.endDate = [NSDate dateWithTimeInterval:60*60.0 sinceDate:event.startDate];
// Make it recur
EKRecurrenceRule *repeatEverySecondWednesdayRecurrenceRule =
[[EKRecurrenceRule alloc] initRecurrenceWithFrequency:EKRecurrenceFrequencyDaily
interval:2
daysOfTheWeek:@[[EKRecurrenceDayOfWeek dayOfWeek:4]]
daysOfTheMonth:nil
monthsOfTheYear:nil
weeksOfTheYear:nil
daysOfTheYear:nil
setPositions:nil
end:[EKRecurrenceEnd recurrenceEndWithOccurrenceCount:20]];
event.recurrenceRules = @[repeatEverySecondWednesdayRecurrenceRule];
// Save the event and update the table view
[self.eventStore saveEvent:event span:EKSpanThisEvent error:nil];
[self refresh:self];
}
}
```
### 1.1 EKRecurrenceRule参数说明
| 参数 | 说明 |
| --- | --- |
| initRecurrenceWithFrequency | 指定事件重复的基本频率,如每日、每周、每月或每年 |
| interval | 根据频率指定重复间隔,如每周频率且间隔为3,则每三周重复一次 |
| daysOfTheWeek | 接受一个NSArray对象,通过`EKRecurrenceDayOfWeek dayOfWeek`方法访问,1表示周日,可指定事件仅在特定星期几重复 |
| daysOfTheMonth | 类似于`daysOfTheWeek`,指定每月的特定日期,仅适用于每月频率的事件 |
| monthsOfTheYear | 类似于`daysOfTheWeek`和`daysOfTheMonth`,仅适用于每年频率的事件 |
| weeksOfTheYear | 仅适用于每年频率的事件,指定特定的周 |
| daysOfTheYear | 仅适用于每年重复的事件,可指定从年初或年末开始的特定日期 |
| setPositions | 终极过滤器,可将事件限制在一年中的特定日期 |
| end | 需要调用`EKRecurrenceEnd`类,指定事件不再重复的条件,有`recurrenceEndWithEndDate`(指定日期后不再重复)和`recurrenceEndWithOccurenceCount`(限制重复次数)两种方法 |
根据上述代码和参数说明,创建的示例循环事件将每两周的周三重复,最多重复20次。
## 2. 创建提醒
在iOS 6中,Apple发布了API,允许应用向Reminders应用添加条目。以下是创建提醒的详细步骤:
### 2.1 设置应用
1. 创建一个新的单视图应用项目。
2. 链接`EventKit.framework`和`CoreLocation.framework`到项目。
3. 在项目属性列表中添加使用说明:
- 添加`Privacy – Location Usage Description`键,值为`Testing Location-Based Reminders`。
- 添加`Privacy – Reminders Usage Description`键,值为`Testing Reminders`。
4. 在`ViewController.xib`中创建用户界面,包含两个按钮和一个Activity Indicator,并设置Activity Indicator的`Hides When Stopped`复选框。
5. 创建按钮的动作`addTimeBasedReminder`和`addLocationBasedReminder`,以及Activity Indicator的出口`activityIndicator`。
6. 在`ViewController.h`中导入相关API并声明`eventStore`属性:
```objc
//
// ViewController.h
// Remind Me
//
#import <UIKit/UIKit.h>
#import <EventKit/EventKit.h>
#import <CoreLocation/CoreLocation.h>
@interface ViewController : UIViewController<CLLocationManagerDelegate>
@property (weak, nonatomic) IBOutlet UIActivityIndicatorView *activityIndicator;
@property (strong, nonatomic)EKEventStore *eventStore;
- (IBAction)addTimeBasedReminder:(id)sender;
- (IBAction)addLocationBasedReminder:(id)sender;
@end
```
7. 在`ViewController.m`中添加`eventStore`的自定义getter:
```objc
- (EKEventStore *)eventStore
{
if (_eventStore == nil)
{
_eventStore = [[EKEventStore alloc] init];
}
return _eventStore;
}
```
### 2.2 请求访问提醒
在`ViewController.h`中声明块类型和方法签名:
```objc
typedef void(^RestrictedEventStoreActionHandler)();
@interface ViewController : UIViewController<CLLocationManagerDelegate>
@property (weak, nonatomic) IBOutlet UIActivityIndicatorView *activityIndicator;
@property (strong, nonatomic)EKEventStore *eventStore;
- (IBAction)addTimeBasedReminder:(id)sender;
- (IBAction)addLocationBasedReminder:(id)sender;
- (void)handleReminderAction:(RestrictedEventStoreActionHandler)block;
@end
```
在`ViewController.m`中实现`handleReminderAction`方法:
```objc
- (void)handleReminderAction:(RestrictedEventStoreActionHandler)block
{
[self.eventStore requestAccessToEntityType:EKEntityTypeReminder
completion:^(BOOL granted, NSError *error)
{
if (granted)
{
block();
}
else
{
UIAlertView *notGrantedAlert = [[UIAlertView alloc] initWithTitle:@"Access Denied"
message:@"Access to device's reminders has been denied for this app."
delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
dispatch_async(dispatch_get_main_queue(), ^{
[notGrantedAlert show];
});
}
}];
}
```
### 2.3 创建基于时间的提醒
以下是创建基于时间提醒的完整代码:
```objc
- (IBAction)addTimeBasedReminder:(id)sender
{
[self.activityIndicator startAnimating];
[self handleReminderAction:^()
{
// Create Reminder
EKReminder *newReminder = [EKReminder reminderWithEventStore:self.eventStore];
newReminder.title = @"Simpsons is on";
newReminder.calendar = [self.eventStore defaultCalendarForNewReminders];
// Calculate the date exactly one day from now
NSCalendar *calendar = [NSCalendar currentCalendar];
NSDateComponents *oneDayComponents = [[NSDateComponents alloc] init];
oneDayComponents.day = 1;
NSDate *nextDay = [calendar dateByAddingComponents:oneDayComponents
toDate:[NSDate date] options:0];
NSUInteger unitFlags = NSEraCalendarUnit | NSYearCalendarUnit |
N
```
0
0
复制全文
相关推荐









