中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

iOS如何實現日歷行程的增刪改查

發布時間:2021-08-29 14:38:11 來源:億速云 閱讀:470 作者:小新 欄目:開發技術

這篇文章主要介紹了iOS如何實現日歷行程的增刪改查,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

前言

我們可以使用系統提供的EventKit框架來訪問和操作用戶的日歷日程和提醒(雖然日歷和提醒是兩個獨立的app,但是是用同一個框架來處理數據)。同樣地,日歷和提醒的數據的數據,都是存儲在同一個叫做Calendar Database的數據庫中:

iOS如何實現日歷行程的增刪改查

EventKit不僅能獲取已存在的日程和提醒,還能在自己的app中創建、編輯、刪除用戶的日程和提醒,還能添加提醒、監聽變化等。

在iOS10+中,若要訪問用戶日程或提醒,需要在info.plist中分別添加NSRemindersUsageDescription和NSCalendarsUsageDescription

一. 讀取日程

我們可以通過EKEventStore類來對用戶的Calendar database進行查詢、創建、編輯、刪除等操作。我們可以使用條件來獲取符合條件的一組日程,也可以用唯一標識來獲取指定的一條日程。獲取到的每一條日程都是一個EKEvent的實例對象,因此我們修改EKEvent對象的屬性即可實現修改日程信息。

1.創建連接

#import <EventKit/EventKit.h>
...
EKEventStore *store = [[EKEventStore alloc] init];

EKEventStore對象的創建和釋放會比較耗時,因此我們一般會在app加載后只創建一個event store對象。

2.通過條件獲取日程

如果要獲取一個時間段內的日程,可以使用EKEventStore對象的eventsMatchingPredicate: 方法。下面代碼演示如何獲取昨天至一年后的所有日程:

// 獲取日歷對象
NSCalendar *calendar = [NSCalendar currentCalendar];

// 創建開始時間
NSDateComponents *oneDayAgoComponents = [[NSDateComponents alloc] init];
oneDayAgoComponents.day = -1;
NSDate *oneDayAgo = [calendar dateByAddingComponents:oneDayAgoComponents
                                              toDate:[NSDate date]
                                             options:0];

// 創建結束時間
NSDateComponents *oneYearFromNowComponents = [[NSDateComponents alloc] init];
oneYearFromNowComponents.year = 1;
NSDate *oneYearFromNow = [calendar dateByAddingComponents:oneYearFromNowComponents
                                                   toDate:[NSDate date]
                                                  options:0];

// 創建條件
NSPredicate *predicate = [store predicateForEventsWithStartDate:oneDayAgo endDate:oneYearFromNow calendars:nil];

// 獲得符合條件的所有日程
NSArray *events = [store eventsMatchingPredicate:predicate];

3.批量處理日程

如果需要批量處理得到的日程,可以用EKEventStore
實例的enumerateEventsMatchingPredicate:usingBlock:方法(同步方法,為了不阻塞主線程建議在其它線程中執行),例如打印出所有符合條件的日程標題:

[store enumerateEventsMatchingPredicate:predicate usingBlock:^(EKEvent * _Nonnull event, BOOL * _Nonnull stop) {
        NSLog(@"event:%@",event.title);
}];

4.通過唯一標識獲取日程

每一個日程都有只讀的唯一標識屬性eventIdentifier,我們可以通過EKEventStore對象的eventWithIdentifier:方法,傳入唯一標識獲取指定的一個日程(這個標識是只讀屬性,由系統指定,可以通過前面的條件查詢獲取,也可以在創建新的日程時保存這個唯一標識),例如我們已經知道一個日程的eventIdentifier值為”D8574A98-A929-4A92-8E9F-048F46FB5DE7:717c8b40-44e3-31ab-8243-2d5918e266ef”:

EKEvent *event = [store eventWithIdentifier:@"D8574A98-A929-4A92-8E9F-048F46FB5DE7:717c8b40-44e3-31ab-8243-2d5918e266ef"];
NSLog(@"event:%@",event);

二.創建日程

1.通過代碼創建

通過EKEvent對象的eventWithEventStore:來創建一個日程,并通過對應的屬性編輯日程詳細信息,部分屬性如:

title - 日程的標題
startDate - 日程的開始日期
endDate - 日程的結束日期
calendar - 日程對應的日歷
alarms - 日程的提醒時間
recurrenceRules - 重復規則

實例代碼:

EKEvent *event = [EKEvent eventWithEventStore:store];
event.title = @"代碼創建的日程";
event.calendar = [store defaultCalendarForNewEvents];
NSCalendar *calendar = [NSCalendar currentCalendar];
NSDateComponents *components = [[NSDateComponents alloc] init];
components.hour = 1;
NSDate *endTime = [calendar dateByAddingComponents:components toDate:[NSDate date] options:0];
event.startDate = [NSDate date];
event.endDate = endTime;
event.notes = @"檔期詳情:hyaction://hunyu-music";
[event addAlarm:[EKAlarm alarmWithRelativeOffset:-10*60]];

NSError *error;
[store saveEvent:event span:EKSpanFutureEvents commit:YES  error:&error];
if (!error) {
    NSLog(@"添加成功!");
}else{
    NSLog(@"添加失敗:%@",error);
}

2.通過系統日歷ui添加日程

#import <EventKitUI/EventKitUI.h>
...

EKEventEditViewController *vc = [[EKEventEditViewController alloc] init];
vc.eventStore = store;
vc.editViewDelegate = self;
[self presentViewController:vc animated:YES completion:nil];

通過實現EKEventEditViewDelegate代理事件獲得結果:

- (void)eventEditViewController:(EKEventEditViewController *)controller didCompleteWithAction:(EKEventEditViewAction)action{
    NSLog(@"添加日程結果:%zd",action);
    [self dismissViewControllerAnimated:YES completion:nil];
}

三.編輯和刪除日程

我們可以通過修改event的屬性值來對日程進行編輯,最后需要調用EKEventStore的實例方法saveEvent:span:commit:error:進行持久化保存:

event.title = @"修改后的標題";
NSError *error;
[store saveEvent:event span:EKSpanFutureEvents commit:YES error:&error];

通過EKEventStore的實例方法removeEvent:span:commit:error:.來刪除日程:

NSError *error;
[store removeEvent:event span:EKSpanFutureEvents error:&error];

四.添加提醒

我們可以給日程添加本地推送提醒,在指定的時間或地點給用戶進行提醒。

1.基于時間的提醒

我們可以通過event的 addAlarm:方法為一個日程添加提醒。我們可以指定一個確切時間或一個相對時間(只能是日程開始時間之前)。通過removeAlarm: 方法可將提醒移除。
如在開始時間前10分鐘提醒:

[event addAlarm:[EKAlarm alarmWithRelativeOffset:-10*60]];

2.基于地理位置的提醒

我們可以設定當用戶進入或離開指定的地理位置區域時,觸發日程提醒。例如當用戶離開公司,提醒用戶需要到超市購買日用品,作為開發者,需要確定一個經緯度以及一個半徑范圍。

EKAlarm *alarm = [[EKAlarm alloc] init];
    EKStructuredLocation *location = [EKStructuredLocation
                                      locationWithTitle:@"Current Location"];
location.geoLocation = [[CLLocation alloc] initWithLatitude:23.1754700000 longitude:113.4147400000];
alarm.structuredLocation = location;
alarm.proximity = EKAlarmProximityEnter;
[event addAlarm:alarm];

感謝你能夠認真閱讀完這篇文章,希望小編分享的“iOS如何實現日歷行程的增刪改查”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

ios
AI

龙游县| 闽侯县| 安仁县| 曲松县| 岳普湖县| 涪陵区| 翁源县| 佳木斯市| 四平市| 南川市| 桐乡市| 谢通门县| 龙川县| 阜新市| 宾阳县| 尼玛县| 江油市| 毕节市| 怀柔区| 齐齐哈尔市| 老河口市| 女性| 济阳县| 云梦县| 井冈山市| 祁阳县| 连云港市| 马尔康县| 龙陵县| 重庆市| 西乌| 石阡县| 安溪县| 康保县| 泸水县| 德兴市| 河曲县| 建水县| 海伦市| 垫江县| 桓仁|