最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

iOS實(shí)現(xiàn)日歷行程的增刪改查

 更新時(shí)間:2021年08月25日 16:17:10   作者:imJackXu  
這篇文章主要為大家詳細(xì)介紹了iOS實(shí)現(xiàn)日歷行程的增刪改查,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

前言

我們可以使用系統(tǒng)提供的EventKit框架來(lái)訪問(wèn)和操作用戶的日歷日程和提醒(雖然日歷和提醒是兩個(gè)獨(dú)立的app,但是是用同一個(gè)框架來(lái)處理數(shù)據(jù))。同樣地,日歷和提醒的數(shù)據(jù)的數(shù)據(jù),都是存儲(chǔ)在同一個(gè)叫做Calendar Database的數(shù)據(jù)庫(kù)中:

EventKit不僅能獲取已存在的日程和提醒,還能在自己的app中創(chuàng)建、編輯、刪除用戶的日程和提醒,還能添加提醒、監(jiān)聽(tīng)變化等。

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

一. 讀取日程

我們可以通過(guò)EKEventStore類(lèi)來(lái)對(duì)用戶的Calendar database進(jìn)行查詢、創(chuàng)建、編輯、刪除等操作。我們可以使用條件來(lái)獲取符合條件的一組日程,也可以用唯一標(biāo)識(shí)來(lái)獲取指定的一條日程。獲取到的每一條日程都是一個(gè)EKEvent的實(shí)例對(duì)象,因此我們修改EKEvent對(duì)象的屬性即可實(shí)現(xiàn)修改日程信息。

1.創(chuàng)建連接

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

EKEventStore對(duì)象的創(chuàng)建和釋放會(huì)比較耗時(shí),因此我們一般會(huì)在app加載后只創(chuàng)建一個(gè)event store對(duì)象。

2.通過(guò)條件獲取日程

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

// 獲取日歷對(duì)象
NSCalendar *calendar = [NSCalendar currentCalendar];

// 創(chuàng)建開(kāi)始時(shí)間
NSDateComponents *oneDayAgoComponents = [[NSDateComponents alloc] init];
oneDayAgoComponents.day = -1;
NSDate *oneDayAgo = [calendar dateByAddingComponents:oneDayAgoComponents
                                              toDate:[NSDate date]
                                             options:0];

// 創(chuàng)建結(jié)束時(shí)間
NSDateComponents *oneYearFromNowComponents = [[NSDateComponents alloc] init];
oneYearFromNowComponents.year = 1;
NSDate *oneYearFromNow = [calendar dateByAddingComponents:oneYearFromNowComponents
                                                   toDate:[NSDate date]
                                                  options:0];

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

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

3.批量處理日程

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

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

4.通過(guò)唯一標(biāo)識(shí)獲取日程

每一個(gè)日程都有只讀的唯一標(biāo)識(shí)屬性eventIdentifier,我們可以通過(guò)EKEventStore對(duì)象的eventWithIdentifier:方法,傳入唯一標(biāo)識(shí)獲取指定的一個(gè)日程(這個(gè)標(biāo)識(shí)是只讀屬性,由系統(tǒng)指定,可以通過(guò)前面的條件查詢獲取,也可以在創(chuàng)建新的日程時(shí)保存這個(gè)唯一標(biāo)識(shí)),例如我們已經(jīng)知道一個(gè)日程的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);

二.創(chuàng)建日程

1.通過(guò)代碼創(chuàng)建

通過(guò)EKEvent對(duì)象的eventWithEventStore:來(lái)創(chuàng)建一個(gè)日程,并通過(guò)對(duì)應(yīng)的屬性編輯日程詳細(xì)信息,部分屬性如:

  • title - 日程的標(biāo)題
  • startDate - 日程的開(kāi)始日期
  • endDate - 日程的結(jié)束日期
  • calendar - 日程對(duì)應(yīng)的日歷
  • alarms - 日程的提醒時(shí)間
  • recurrenceRules - 重復(fù)規(guī)則

實(shí)例代碼:

EKEvent *event = [EKEvent eventWithEventStore:store];
event.title = @"代碼創(chuàng)建的日程";
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.通過(guò)系統(tǒng)日歷ui添加日程

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

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

通過(guò)實(shí)現(xiàn)EKEventEditViewDelegate代理事件獲得結(jié)果:

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

三.編輯和刪除日程

我們可以通過(guò)修改event的屬性值來(lái)對(duì)日程進(jìn)行編輯,最后需要調(diào)用EKEventStore的實(shí)例方法saveEvent:span:commit:error:進(jìn)行持久化保存:

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

通過(guò)EKEventStore的實(shí)例方法removeEvent:span:commit:error:.來(lái)刪除日程:

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

四.添加提醒

我們可以給日程添加本地推送提醒,在指定的時(shí)間或地點(diǎn)給用戶進(jìn)行提醒。

1.基于時(shí)間的提醒

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

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

2.基于地理位置的提醒

我們可以設(shè)定當(dāng)用戶進(jìn)入或離開(kāi)指定的地理位置區(qū)域時(shí),觸發(fā)日程提醒。例如當(dāng)用戶離開(kāi)公司,提醒用戶需要到超市購(gòu)買(mǎi)日用品,作為開(kāi)發(fā)者,需要確定一個(gè)經(jīng)緯度以及一個(gè)半徑范圍。

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];

參考蘋(píng)果官方文檔 

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • iOS開(kāi)發(fā)底層探索界面優(yōu)化示例詳解

    iOS開(kāi)發(fā)底層探索界面優(yōu)化示例詳解

    這篇文章主要為大家介紹了iOS開(kāi)發(fā)底層探索界面優(yōu)化示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • 仿IOS效果 帶彈簧動(dòng)畫(huà)的ListView

    仿IOS效果 帶彈簧動(dòng)畫(huà)的ListView

    這篇文章主要介紹了仿IOS效果,帶彈簧動(dòng)畫(huà)的ListView,感興趣的小伙伴們可以參考一下
    2016-01-01
  • iOS開(kāi)發(fā)探索多線程GCD隊(duì)列示例詳解

    iOS開(kāi)發(fā)探索多線程GCD隊(duì)列示例詳解

    這篇文章主要為大家介紹了iOS開(kāi)發(fā)探索多線程GCD隊(duì)列示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • iOS實(shí)現(xiàn)圖片保存與搜索功能

    iOS實(shí)現(xiàn)圖片保存與搜索功能

    這篇文章主要介紹了iOS實(shí)現(xiàn)圖片保存與搜索功能的相關(guān)資料,需要的朋友可以參考下
    2016-02-02
  • iOS 本地存儲(chǔ)NSUserDefaults封裝代碼

    iOS 本地存儲(chǔ)NSUserDefaults封裝代碼

    下面小編就為大家分享一篇iOS 本地存儲(chǔ)NSUserDefaults封裝代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-01-01
  • iOS?Lotusoot模塊化工具應(yīng)用的動(dòng)態(tài)思路

    iOS?Lotusoot模塊化工具應(yīng)用的動(dòng)態(tài)思路

    項(xiàng)目的不斷更迭,導(dǎo)致項(xiàng)目越來(lái)越大,越來(lái)越臃腫,為了讓項(xiàng)目更加條理,需要對(duì)項(xiàng)目進(jìn)行模塊化處理,為了減少模塊之間的耦合,于是就有了Lotusoot這個(gè)工具
    2022-08-08
  • 淺談iOS 屏幕方向那點(diǎn)事兒

    淺談iOS 屏幕方向那點(diǎn)事兒

    這篇文章主要介紹了淺談iOS 屏幕方向那點(diǎn)事兒,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-07-07
  • h5 ios輸入框和鍵盤(pán)的兼容性優(yōu)化指南

    h5 ios輸入框和鍵盤(pán)的兼容性優(yōu)化指南

    這篇文章主要給大家介紹了關(guān)于h5 ios輸入框和鍵盤(pán)的兼容性優(yōu)化的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-11-11
  • UIPageViewController實(shí)現(xiàn)的左右滑動(dòng)界面

    UIPageViewController實(shí)現(xiàn)的左右滑動(dòng)界面

    這篇文章主要為大家詳細(xì)介紹了UIPageViewController實(shí)現(xiàn)的左右滑動(dòng)界面,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-06-06
  • iOS字體大小適配的3種方法示例代碼

    iOS字體大小適配的3種方法示例代碼

    這篇文章主要給大家介紹了關(guān)于iOS字體大小適配的3種方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)各位iOS開(kāi)發(fā)者們具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-11-11

最新評(píng)論

中方县| 图们市| 岑溪市| 承德县| 家居| 宁陵县| 宁强县| 怀化市| 西乌珠穆沁旗| 庆阳市| 中卫市| 博爱县| 山西省| 和平县| 康保县| 襄汾县| 新安县| 罗甸县| 华宁县| 资阳市| 宝坻区| 华容县| 福泉市| 晋江市| 边坝县| 张家川| 象山县| 墨江| 黑山县| 商水县| 通海县| 江陵县| 合作市| 南安市| 故城县| 翼城县| 绥芬河市| 太和县| 清流县| 涞水县| 安宁市|