日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

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

 

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

Example scenario

場景

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

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

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

資源

Xcode工程示例

Storyboard setup

故事面板設置

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

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

當被授予訪問權(quán)限時,tableview顯示日歷列表

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

當用戶授予我們訪問權(quán)限,我們想列出一個表視圖的日歷.在接下來的教程中,我們將擔心數(shù)據(jù)源的設置.現(xiàn)在,我們將從實用工具欄中拽一個表格視圖過來.

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

Center X

Center Y

Equal width to Superview

Top space to Top Layout Guide for height.

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

Resources

資源

Screencast: Setting Up a Table View

Full transcript

這里有這些約束的詳細視圖,以及故事板看起來像裝表視圖的視覺效果.

 

 

 

 

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

訪問被拒絕時的”需要許可”視圖

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

我在示例項目中的方法是在故事板場景中組織一個新的視圖,該視圖包含一個展示操作說明的標簽和一個點擊后使用戶進入我們應用程序的設置界面的按鈕.

再次,一些約束涉及到在運行時使一些事物正確的顯示.在這里我不會講述這個細節(jié),因為它很可能因為每一個執(zhí)行操作而有一點不同.

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

blob.png

Event Store的角色

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

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

ViewController.swift

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

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

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

我們在哪里檢查日歷授權(quán)很重要.我的建議是每次在視圖出現(xiàn)時檢查(即在viewWillAppear()中),因為用戶首次授予訪問權(quán)限,切換設置,拒絕訪問的情況是完全有可能的.我們的應用程序需要做出適當?shù)捻憫?

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

在這個文章提供的示例工程中,我已經(jīng)創(chuàng)建了一個名為checkCalendarAuthorizationStatus()的函數(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實現(xiàn)的.傳入的EKEntityTypeEvent用于跟用戶日歷進行交互.如果我們想要檢查他們的提醒的權(quán)限,我們將在這里使用EKEntityTypeReminder.

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

讓我們一步步來看一看這些功能.

請求訪問日歷

正如標題所說的,所有的事情從這里開始.每當我們的應用程序加載和調(diào)用authorizationStatusForEntityType的時候,將返回NotDetermined的狀態(tài).就是在這一點上我們想請求訪問日歷.

為了這樣做,按照下面的方法定義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實例提供了一個名為requestAccessToEntityType的函數(shù).再次將EKEntityTypeEvent作為我們請求訪問日歷的參數(shù)傳遞.剩余的有趣的部分在我們提供的封裝完的閉包里能夠找到.

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

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

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

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

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

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

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() } // ... }

拒絕訪問–顯示需要許可視圖

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

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

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

結(jié)束語

這幾乎完成了使用 Event Kit的開始工作!對于checkCalendarAuthorizationStatus()函數(shù)的其余案例簡單的重用,我只是簡單的剖析了請求允許的過程.

我鼓勵你們跳到Github,并且作為你應用程序中利用Event Kit的開始,自己深入研究這些代碼.

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

LED驅(qū)動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: 驅(qū)動電源

在工業(yè)自動化蓬勃發(fā)展的當下,工業(yè)電機作為核心動力設備,其驅(qū)動電源的性能直接關(guān)系到整個系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動勢抑制與過流保護是驅(qū)動電源設計中至關(guān)重要的兩個環(huán)節(jié),集成化方案的設計成為提升電機驅(qū)動性能的關(guān)鍵。

關(guān)鍵字: 工業(yè)電機 驅(qū)動電源

LED 驅(qū)動電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個照明設備的使用壽命。然而,在實際應用中,LED 驅(qū)動電源易損壞的問題卻十分常見,不僅增加了維護成本,還影響了用戶體驗。要解決這一問題,需從設計、生...

關(guān)鍵字: 驅(qū)動電源 照明系統(tǒng) 散熱

根據(jù)LED驅(qū)動電源的公式,電感內(nèi)電流波動大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關(guān)鍵字: LED 設計 驅(qū)動電源

電動汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產(chǎn)業(yè)的重要發(fā)展方向。電動汽車的核心技術(shù)之一是電機驅(qū)動控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機驅(qū)動系統(tǒng)中的關(guān)鍵元件,其性能直接影響到電動汽車的動力性能和...

關(guān)鍵字: 電動汽車 新能源 驅(qū)動電源

在現(xiàn)代城市建設中,街道及停車場照明作為基礎設施的重要組成部分,其質(zhì)量和效率直接關(guān)系到城市的公共安全、居民生活質(zhì)量和能源利用效率。隨著科技的進步,高亮度白光發(fā)光二極管(LED)因其獨特的優(yōu)勢逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關(guān)鍵字: 發(fā)光二極管 驅(qū)動電源 LED

LED通用照明設計工程師會遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關(guān)鍵字: LED 驅(qū)動電源 功率因數(shù)校正

在LED照明技術(shù)日益普及的今天,LED驅(qū)動電源的電磁干擾(EMI)問題成為了一個不可忽視的挑戰(zhàn)。電磁干擾不僅會影響LED燈具的正常工作,還可能對周圍電子設備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來解決L...

關(guān)鍵字: LED照明技術(shù) 電磁干擾 驅(qū)動電源

開關(guān)電源具有效率高的特性,而且開關(guān)電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機重量也有所下降,所以,現(xiàn)在的LED驅(qū)動電源

關(guān)鍵字: LED 驅(qū)動電源 開關(guān)電源

LED驅(qū)動電源是把電源供應轉(zhuǎn)換為特定的電壓電流以驅(qū)動LED發(fā)光的電壓轉(zhuǎn)換器,通常情況下:LED驅(qū)動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: LED 隧道燈 驅(qū)動電源
關(guān)閉