www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁(yè) > 嵌入式 > 嵌入式軟件
[導(dǎo)讀] EventKit為獲取和操作用戶日歷事件和提醒提供了一系列的類.在下面的教程中,我的目標(biāo)是帶領(lǐng)你走出利用EventKit建立一個(gè)應(yīng)用程序的第.我的目標(biāo)是帶領(lǐng)你邁出利用EventKit建立

 

EventKit為獲取和操作用戶日歷事件和提醒提供了一系列的類.在下面的教程中,我的目標(biāo)是帶領(lǐng)你走出利用EventKit建立一個(gè)應(yīng)用程序的第.我的目標(biāo)是帶領(lǐng)你邁出利用EventKit建立一個(gè)應(yīng)用程序的第一步.我將演示如何向用戶的日歷請(qǐng)求許可,我還將展示幾個(gè)處理用戶響應(yīng)的例子(當(dāng)他們授予訪問(wèn)權(quán)限,或者拒絕).

Example scenario

場(chǎng)景

讓我們先提出一個(gè)基本方案,作為本教程的例子。

假設(shè)我們正在構(gòu)建一個(gè)應(yīng)用程序,現(xiàn)在,有一個(gè)單一的視圖控制器。在得到用戶授權(quán)允許的情況下,我們希望這個(gè)視圖控制器顯示日歷列表。如果用戶拒絕訪問(wèn),我們將向用戶展示一個(gè)消息,用來(lái)說(shuō)明我們的應(yīng)用程序在沒(méi)有訪問(wèn)權(quán)限時(shí)不能運(yùn)行,我們也將允許他們通過(guò)單擊一個(gè)按鈕能夠在他們的設(shè)備的設(shè)置中設(shè)置授權(quán)訪問(wèn).

我已經(jīng)創(chuàng)建一個(gè)那樣的應(yīng)用程序作為例子–跳到GitHub中查看并研究這個(gè)例子的代碼.

資源

Xcode工程示例

Storyboard setup

故事面板設(shè)置

你使用EventKit的第一步就是需要為自己創(chuàng)建一個(gè)用戶界面來(lái)處理當(dāng)你第一個(gè)程序啟動(dòng)時(shí)用戶對(duì)”該程序可以訪問(wèn)你的日歷嗎?”對(duì)出不同的響應(yīng),不久,我們將得到如何請(qǐng)求這個(gè)許可的詳情.但首先,讓我們來(lái)剖析我們?nèi)绾斡脤?duì)于一個(gè)許可操作導(dǎo)致的給定響應(yīng)能夠做正確的操作的一些視圖來(lái)安排我們的故事板.

用戶可以授予訪問(wèn)權(quán)限,也可以拒絕授予訪問(wèn)權(quán)限來(lái)通知他們的日歷或者提醒.我們需要為這兩種情況做好準(zhǔn)備.

當(dāng)被授予訪問(wèn)權(quán)限時(shí),tableview顯示日歷列表

我今天持樂(lè)觀態(tài)度,所以讓我們開(kāi)始處理從一開(kāi)始用戶就授予我們?cè)L問(wèn)他們?nèi)諝v的權(quán)限的情況.

當(dāng)用戶授予我們?cè)L問(wèn)權(quán)限,我們想列出一個(gè)表視圖的日歷.在接下來(lái)的教程中,我們將擔(dān)心數(shù)據(jù)源的設(shè)置.現(xiàn)在,我們將從實(shí)用工具欄中拽一個(gè)表格視圖過(guò)來(lái).

為了得到填滿整個(gè)屏幕的表視圖,我做了幾件事情.通常,當(dāng)你從實(shí)用工具欄中拽一個(gè)表視圖過(guò)來(lái)的時(shí)候,它會(huì)在故事板中填滿整個(gè)場(chǎng)景.在布局中我向下拖頂部邊緣知道它”捕捉”到我所期望的狀態(tài)欄底部被定位的那行.然后,我設(shè)置了以下限制:

Center X

Center Y

Equal width to Superview

Top space to Top Layout Guide for height.

我已經(jīng)創(chuàng)建了一個(gè)設(shè)置表視圖的簡(jiǎn)短截屏,如果你想要一個(gè)完整的練習(xí),可以參看下面鏈接的內(nèi)容:

Resources

資源

Screencast: Setting Up a Table View

Full transcript

這里有這些約束的詳細(xì)視圖,以及故事板看起來(lái)像裝表視圖的視覺(jué)效果.

 

 

 

 

最后一點(diǎn),在故事板中我已經(jīng)將這個(gè)表視圖的hidden屬性設(shè)置為true.根據(jù)用戶允許或者拒絕對(duì)日歷的訪問(wèn)后,我將切換表的可見(jiàn)性,但我認(rèn)為值得指出的是在我例子中表視圖的初始狀態(tài)是被隱藏.

訪問(wèn)被拒絕時(shí)的”需要許可”視圖

但有時(shí),用戶拒絕授權(quán)訪問(wèn)日歷,在意識(shí)到這樣做將導(dǎo)致基本上停止你應(yīng)用程序所有的功能之前,如果你的整個(gè)應(yīng)用程序或者只是該應(yīng)用程序的一部分需要訪問(wèn)功能,你需要一種方法來(lái)告知用戶,并為他們提供一種方法跳到用戶設(shè)置,如果可能的話讓用戶手動(dòng)授予訪問(wèn)權(quán)限.

我在示例項(xiàng)目中的方法是在故事板場(chǎng)景中組織一個(gè)新的視圖,該視圖包含一個(gè)展示操作說(shuō)明的標(biāo)簽和一個(gè)點(diǎn)擊后使用戶進(jìn)入我們應(yīng)用程序的設(shè)置界面的按鈕.

再次,一些約束涉及到在運(yùn)行時(shí)使一些事物正確的顯示.在這里我不會(huì)講述這個(gè)細(xì)節(jié),因?yàn)樗芸赡芤驗(yàn)槊恳粋€(gè)執(zhí)行操作而有一點(diǎn)不同.

我將指出的意見(jiàn)事情是,這個(gè)視圖的透明度已經(jīng)被設(shè)置為0,以便如果用戶拒絕授權(quán),我能夠展示一個(gè)逐漸消失的效果.下面就來(lái)看看在設(shè)置了隱藏“NeedPermissionsView”的場(chǎng)景:

blob.png

Event Store的角色

EventKit的核心是EKEventStore.EKEventStore是事物的中心.創(chuàng)建EKEventStore的一個(gè)實(shí)例,為開(kāi)發(fā)人員提供了對(duì)用戶的日歷和提醒列表中執(zhí)行各種讀/寫操作的API.

一個(gè)與日歷交互的視圖控制器應(yīng)該有一個(gè)引用EKEventStore的實(shí)例.這很容易被創(chuàng)建–這里是一個(gè)例子:

ViewController.swift

class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate { let eventStore = EKEventStore() // ... }

檢查日歷的授權(quán)

一旦我們有了引用EKEventStore的實(shí)例,我們可以做像檢查用戶是否授權(quán)訪問(wèn)他們的日歷這樣的事情.根據(jù)這里,我們可以做是否需要請(qǐng)求許可的決定,隨后確定要顯示的視圖(表視圖或者需要許可視圖).

我們?cè)谀睦餀z查日歷授權(quán)很重要.我的建議是每次在視圖出現(xiàn)時(shí)檢查(即在viewWillAppear()中),因?yàn)橛脩羰状问谟柙L問(wèn)權(quán)限,切換設(shè)置,拒絕訪問(wèn)的情況是完全有可能的.我們的應(yīng)用程序需要做出適當(dāng)?shù)捻憫?yīng).

In the example project provided with this article, I’ve created a function named checkCalendarAuthorizationStatus(). Here a peek at what it does:

在這個(gè)文章提供的示例工程中,我已經(jīng)創(chuàng)建了一個(gè)名為checkCalendarAuthorizationStatus()的函數(shù).

接下來(lái)看看它的實(shí)現(xiàn):

ViewController.swift

class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate { // ... override func viewWillAppear(animated: Bool) { checkCalendarAuthorizationStatus() } func checkCalendarAuthorizationStatus() { let status = EKEventStore.authorizationStatusForEntityType(EKEntityTypeEvent) switch (status) { case EKAuthorizationStatus.NotDetermined: // This happens on first-run requestAccessToCalendar() case EKAuthorizationStatus.Authorized: // Things are in line with being able to show the calendars in the table view loadCalendars() refreshTableView() case EKAuthorizationStatus.Restricted, EKAuthorizationStatus.Denied: // We need to help them give us permission needPermissionView.fadeIn() default: let alert = UIAlertView(title: "Privacy Warning", message: "You have not granted permission for this app to access your Calendar", delegate: nil, cancelButtonTitle: "OK") alert.show() } } // ... }

這里關(guān)鍵的功能是EKEventStore的 authorizationStatusForEntityType實(shí)現(xiàn)的.傳入的EKEntityTypeEvent用于跟用戶日歷進(jìn)行交互.如果我們想要檢查他們的提醒的權(quán)限,我們將在這里使用EKEntityTypeReminder.

EKAuthorizationStatus的可能值根據(jù)switch里的相應(yīng)的case來(lái)執(zhí)行封裝好的方便閱讀的獨(dú)立功能的邏輯代碼.

讓我們一步步來(lái)看一看這些功能.

請(qǐng)求訪問(wèn)日歷

正如標(biāo)題所說(shuō)的,所有的事情從這里開(kāi)始.每當(dāng)我們的應(yīng)用程序加載和調(diào)用authorizationStatusForEntityType的時(shí)候,將返回NotDetermined的狀態(tài).就是在這一點(diǎn)上我們想請(qǐng)求訪問(wèn)日歷.

為了這樣做,按照下面的方法定義requestAccessToCalendar函數(shù):

requestAccessToCalendar() class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate { // … func requestAccessToCalendar() { eventStore.requestAccessToEntityType(EKEntityTypeEvent, completion: { (accessGranted: Bool, error: NSError!) in if accessGranted == true { // Ensure that UI refreshes happen back on the main thread! dispatch_async(dispatch_get_main_queue(), { self.loadCalendars() self.refreshTableView() }) } else { // Ensure that UI refreshes happen back on the main thread! dispatch_async(dispatch_get_main_queue(), { self.needPermissionView.fadeIn() }) } }) } // … }

我們的EKEventStore實(shí)例提供了一個(gè)名為requestAccessToEntityType的函數(shù).再次將EKEntityTypeEvent作為我們請(qǐng)求訪問(wèn)日歷的參數(shù)傳遞.剩余的有趣的部分在我們提供的封裝完的閉包里能夠找到.

在實(shí)現(xiàn)里有三個(gè)主要的事情需要注意:

傳遞到閉包里的兩個(gè)參數(shù)一個(gè)是用來(lái)說(shuō)明訪問(wèn)權(quán)限是否被授予的Bool類型的,另一個(gè)是NSError.

我們需要調(diào)用dispatch_async(),并表明我們要調(diào)回主隊(duì)列中執(zhí)行刷新UI的操作.

self.needPermissionView.fadeIn()作為我操作中的一個(gè)UIView的拓展,[Swift中漸入/淡出動(dòng)畫的拓展類(Fade In / Out Animations as Class Extensions in Swift)](https://github.com/andrewcbancroft/EventTracker/tree/ask-for-permission).

授予訪問(wèn)權(quán)限!加載日歷和刷新表視圖

當(dāng)被允許訪問(wèn)的時(shí)候,我們可以調(diào)用eventStore實(shí)例中的calendarsForEntityType函數(shù),并傳遞EKEntityTypeEvent去抓取用戶日歷的數(shù)組在我們的表視圖中顯示.下面就來(lái)看看:

loadCalendars() class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate { // ... var calendars: [EKCalendar]? // ... func loadCalendars() { self.calendars = eventStore.calendarsForEntityType(EKEntityTypeEvent) as? [EKCalendar] } func refreshTableView() { calendarsTableView.hidden = false calendarsTableView.reloadData() } // ... }

拒絕訪問(wèn)–顯示需要許可視圖

當(dāng)訪問(wèn)被拒絕的時(shí)候,我們需要彈出在故事板場(chǎng)景中創(chuàng)建的“Needs Permission View”.

在這個(gè)視圖中,上面的函數(shù)重新被調(diào)用,這樣有一個(gè)能夠讓用戶直接跳轉(zhuǎn)到我們應(yīng)用程序的設(shè)置頁(yè)面中,以便他們能夠從那里授權(quán)日歷訪問(wèn).這個(gè)按鈕連線到了一個(gè)IBAction.下面有實(shí)現(xiàn)IBAction的例子:

goToSettingsButtonTapped() class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate { // ... @IBAction func goToSettingsButtonTapped(sender: UIButton) { let openSettingsUrl = NSURL(string: UIApplicationOpenSettingsURLString) UIApplication.sharedApplication().openURL(openSettingsUrl!) } // ... }

結(jié)束語(yǔ)

這幾乎完成了使用 Event Kit的開(kāi)始工作!對(duì)于checkCalendarAuthorizationStatus()函數(shù)的其余案例簡(jiǎn)單的重用,我只是簡(jiǎn)單的剖析了請(qǐng)求允許的過(guò)程.

我鼓勵(lì)你們跳到Github,并且作為你應(yīng)用程序中利用Event Kit的開(kāi)始,自己深入研究這些代碼.

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

倫敦2024年8月29日 /美通社/ -- 英國(guó)汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開(kāi)發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來(lái)越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來(lái)越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場(chǎng)的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開(kāi)幕式在貴陽(yáng)舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語(yǔ)權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營(yíng)業(yè)績(jī)穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤(rùn)率延續(xù)升勢(shì) 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長(zhǎng) 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競(jìng)爭(zhēng)力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競(jìng)爭(zhēng)優(yōu)勢(shì)...

關(guān)鍵字: 通信 BSP 電信運(yùn)營(yíng)商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國(guó)電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場(chǎng) NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長(zhǎng)三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡(jiǎn)稱"軟通動(dòng)力")與長(zhǎng)三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉