国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

ios9學習系列: Contacts Framework

移動開發
iOS 9 中,蘋果介紹了新的 Contacts framework。允許用戶使用 Objective-C 的 API 和設備的通訊錄進行交互,同樣適用于 Swift 語言。比起之前通過 AddressBook framework 來讀取聯系人信息來說,這是一個巨大的進步。因為 AddressBook framework 沒有 Objective-C 的 API,非常難用,用 Swift 寫的時候更是痛苦。希望新的 Contacts framework 能夠解決這些痛點。

iOS 9 中,蘋果介紹了新的 Contacts framework。允許用戶使用 Objective-C 的 API 和設備的通訊錄進行交互,同樣適用于 Swift 語言。比起之前通過 AddressBook framework 來讀取聯系人信息來說,這是一個巨大的進步。因為 AddressBook framework 沒有 Objective-C 的 API,非常難用,用 Swift 寫的時候更是痛苦。希望新的 Contacts framework 能夠解決這些痛點。

開發者有多不喜歡 AddressBook framework 呢?我想在 WWDC 的相關 session 里,當宣布 AddressBook framework 會在 iOS 9 中棄用后,現場爆發了最長時間、***聲的歡呼,就是***的證明。

從 Framework 中返回的聯系人是統一的,這意味著,如果你有從不同的數據源來的相同聯系人數據,他們會自動合并,無需手動進行合并的操作。

使用新的 Contacts Framework

現在我們來創建一個簡單的應用。這個應用展示一個你的通訊錄的聯系人列表,同時允許你查看(聯系人的)詳細信息。

contact result

 

如果你所見,這是一個 master detail view controller 應用,在 iPhone 同樣可以很好的展示。在左邊是一個你的設備上的聯系人列表,右邊可以看到聯系人的頭像、姓名、電話號碼等詳細信息。

獲取用戶的聯系人

用Xcode 新建一個項目,只需要選擇 master detail view controller 模版就可以開始了。他會給你設置好。

創建好項目后,打開 MasterViewController 類,首先我們要在頭部引入 Contacts 和 ContactsUI 框架。

import Contacts

import ContactsUI

現在我們寫一個方法,填充 datasrouce的特性。這個方法要讀取和展示當前設備通訊錄里的聯系人。

func findContacts() -> [CNContact] {

let store = CNContactStore()

CNContactStore 是一個用來讀取和保存聯系人的新的類。這篇文章中我們僅僅展示如何讀取聯系人,但是你同樣可以(用此方法)進行展示和保存聯系人群組操作。

let keysToFetch = [CNContactFormatter.descriptorForRequiredKeysForStyle(.FullName),

CNContactImageDataKey,

CNContactPhoneNumbersKey]

let fetchRequest = CNContactFetchRequest(keysToFetch: keysToFetch)

當我們有了這個聯系人數據庫的引用后,我們需要創建一個指定條件的請求,通過這個 query 的請求去獲取某些結果。創建一個 CNContactFetchRequest ,我們可以通過設置 contact keys 的數組,來獲取我們需要的結果。有趣的是,我們可以通過CNContactFormatter.descriptorForRequiredKeysForStyle(.FullName) 來格式化。這是CNContactFormattter 的一個非常方便的方法,稍后我們還會用到。

CNContactFormatter 需要很多不同的 keys,如果不使用 descriptorForRequiredKeysForStyle 方法,我們需要手動設置以下的 keys。

[CNContactGivenNameKey,

CNContactNamePrefixKey,

CNContactNameSuffixKey,

CNContactMiddleNameKey,

CNContactFamilyNameKey,

CNContactTypeKey...]

如你所見,要寫一大堆代碼。當 CNContactFormatter key 的需求發生改變,在從CNContactFormatter 生成一個字符串時,你會接到一個異常。

  1. var contacts = [CNContact]() 
  2.  
  3. do { 
  4.  
  5.     try store.enumerateContactsWithFetchRequest(fetchRequest, usingBlock: { (let contact, let stop) -> Void in 
  6.  
  7.     contacts.append(contact) 
  8.  
  9. }) 
  10.  
  11.  
  12. catch let error as NSError { 
  13.  
  14.     print(error.localizedDescription) 
  15.  
  16.  
  17. return contacts 

這段代碼非常簡單。我們所做的是從 CNContactStore 中遍歷所有符合我們需求的聯系人。這個request 沒有加任何的條件,所以會返回全部的聯系人,包含我們需要的 keys。我們把每一條記錄都逐個保存到一個數組中,返回。

現在我們要調用這個方法,用表格來展示結果。再次打開 MasterViewController, 添加一個屬性,用來展示結果。

var contacts = [CNContact]()

更新 viewDidLoad 方法,用同步的方法調用并存儲結果。

  1. dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) { 
  2.  
  3.     self.contacts = self.findContacts() 
  4.  
  5.     dispatch_async(dispatch_get_main_queue()) { 
  6.  
  7.         self.tableView!.reloadData() 
  8.  
  9.     } 
  10.  
  11.   
  12.  

 一旦保存好結果,刷新表格。

你需要修改一下 UITableViewDatasource 的方法來展示剛剛得到的結果。

  1. override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
  2.  
  3.     return self.contacts.count 
  4.  
  5.  
  6. override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
  7.  
  8.     let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) 
  9.  
  10.     let contact = contacts[indexPath.row] as CNContact 
  11.  
  12.     cell.textLabel!.text = "\(contact.givenName) \(contact.familyName)" 
  13.  
  14.     return cell 
  15.  

現在剩下的就是在 DetailViewController 中展示聯系人的詳細信息了。這里我不在細述,你需要在 DetailViewController 中添加一個圖像視圖、兩個標簽視圖,來展示頭像、姓名和電話號碼。并且在 interface builder 中創建 IBOutlet.

@IBOutlet weak var contactImageView: UIImageView!

@IBOutlet weak var contactNameLabel: UILabel!

@IBOutlet weak var contactPhoneNumberLabel: UILabel!

當這些做完,我們需要設置當前的值。在 configureView ,你需要添加下面這行代碼。

label.text = CNContactFormatter.stringFromContact(contact, style: .FullName)

正如我們之前提到的,CNContactFormatter 能夠很好的格式化聯系人的名字。我們所要做的僅僅是按需求格式化他們,formatter可以很好的控制格式。

在設置頭像時,我們需要先檢測一下 imageData 是否存在。如果設備上的某個聯系人沒有設置頭像, imageData 可能沒有,(不檢測的話)應用會崩潰。

  1. if contact.imageData != nil { 
  2.  
  3.     imageView.image = UIImage(data: contact.imageData!) 
  4.  
  5. else { 
  6.  
  7.     imageView.image = nil 
  8.  

如果存在,我們給 image view 設置好。

***,我們給電話號碼標簽指定值。

  1. if let phoneNumberLabel = self.contactPhoneNumberLabel { 
  2.  
  3.     var numberArray = [String]() 
  4.  
  5.     for number in contact.phoneNumbers { 
  6.  
  7.         let phoneNumber = number.value as! CNPhoneNumber 
  8.  
  9.         numberArray.append(phoneNumber.stringValue) 
  10.  
  11.     } 
  12.  
  13.     phoneNumberLabel.text = ", ".join(numberArray) 
  14.  

這是最終的展示結果。現在,我們擁有一個app,可以在左側,顯示設備上通訊錄中聯系人的列表,并可以逐個找到他的詳細信息。

 

contact details

 

使用 ContactsUI 選擇聯系人

也許我們希望這個應用,可以讓用戶自己選擇聯系人,并且展示詳細信息給我們。正如此前你看到的,這可能要寫很多代碼。如果這些功能已經做好了的,會讓開發變的更加簡單。

這正是 ContactsUI framework 的功能。他提供了一套 view controllers,我們可以用在我們的應用中,展示聯系人的信息。

在這一節,我們想讓用戶可以選擇某個電話號碼,并且保存起來。因為只是一個 demo,所以我們選擇在 MasterViewController 的右上角添加一個 UIBarButtonItem,然后在 MasterViewController 類中,給 UIBarButtonItem 一個方法。

@IBAction func showContactsPicker(sender: UIBarButtonItem) {

    let contactPicker = CNContactPickerViewController()

    contactPicker.delegate = self;

    contactPicker.displayedPropertyKeys = [CNContactPhoneNumbersKey]

    self.presentViewController(contactPicker, animated: true, completion: nil)

}

我們創建了一個簡單的 CNContactPickerViewController ,設置他的代理為 self.這樣我們就能夠響應他的請求,我們感興趣的事電話號碼,盡在選中電話號碼后,展示聯系人信息。CNContactPickerViewController 幫我們控制UI。

  1. func contactPicker(picker: CNContactPickerViewController, didSelectContactProperty contactProperty: CNContactProperty) { 
  2.  
  3.     let contact = contactProperty.contact 
  4.  
  5.     let phoneNumber = contactProperty.value as! CNPhoneNumber 
  6.  
  7.     print(contact.givenName) 
  8.  
  9.     print(phoneNumber.stringValue) 
  10.  

在 contactPicker 代理方法 didSelectContactProperty 中,我們復制一個CNContactProperty 對象。這是 CNContact 的一個 wrapper。讓我們來看一下他是怎么工作的。

 

contact picker

 

當我們點擊 MasterViewController 右上角的 UIBarButtonItem 后,會展示一個頁面。這個頁面是所有聯系人的列表,我們沒有添加任何的過濾條件。

 

contact selected

 

當你點擊某個聯系人,會展示出這個聯系人的電話列表。正是我們之前CNContactPhoneNumbersKey 里設置的一樣,這個頁面僅展示了我們需要的關鍵字段。

***,當你點擊了頁面中某些屬性,例如電話號碼后,會在 picker 關閉前觸發 contactPicker:didSelectContactProperty方法。

在這個例子中,名字叫“Kate Bell”的聯系人是 CNContact 的一個例子。“phoneNumbers”是 key,“5555648583”是 CNPhoneNumber 的值。*** identifier 字符串作為他的 identifier property.

總結一下,這個例子里我們使用 ContactsUI framework 來展示選取某個聯系人,是多么簡單和易用。如果你想開發更加豐富的頁面,更自主的控制頁面的展示信息,Contacts framework 會給你提供很好的獲取數據信息的方式。

延伸閱讀

更多關于 Contacts Framework 的信息,我推薦你觀看WWDC 2015 的 session 223Introducing the Contacts Framework for iOS and OS X. ***不要忘了,你可以在Github 上找到我們已經創建的本篇文章的Demo項目。

責任編輯:倪明 來源: Shinobi Controls
相關推薦

2015-09-16 09:55:12

ios9學習UIKit Dynam

2015-08-20 09:00:23

ios9api

2015-09-25 09:44:24

ios9MapkitTrans

2016-03-18 11:19:57

ios9replaykit入門

2015-08-24 09:19:05

ios9split scree

2015-08-20 09:19:46

ios9uistackview

2015-07-16 12:59:19

IOS9UIDynamics

2015-10-16 14:27:29

iOS9collectionV特性

2015-09-23 10:30:44

iOS 9UIStack Vie

2015-07-02 17:32:28

iOS 9蘋果

2015-09-09 15:51:54

2015-11-11 10:17:15

ios9聯系人框架干貨

2015-09-10 09:31:43

IOS9IOS9.1

2015-09-16 09:02:10

IOS9新功能搜索業務

2015-07-27 09:04:33

ios9

2015-05-19 09:51:57

WWDCiOS9

2015-10-20 09:36:52

蘋果iOS 9字體

2015-07-13 16:56:40

IOS 9適配教程

2015-10-12 11:26:12

iOS 9適配

2015-08-03 10:03:09

iosuistack vie
點贊
收藏

51CTO技術棧公眾號

国产视频九色蝌蚪| 天堂成人在线| 国产精品对白久久久久粗| 91久久久免费一区二区| 正义之心1992免费观看全集完整版| 北条麻妃一区二区三区在线| 欧美乱妇15p| 国产原创精品在线| 美女免费视频一区二区| 国产精品一区二区3区| 在线毛片观看| 在线看国产一区| 国产性xxxx18免费观看视频| 亚洲综合国产激情另类一区| 国产成人精品av| 免费视频观看成人| 精品日韩99亚洲| 女人偷人在线视频| 亚洲欧美日韩系列| 9久久9毛片又大又硬又粗| 中文一区二区| 亚洲一区二区三区乱码aⅴ| 97se亚洲| 色综久久综合桃花网| av在线播放国产| 国产尤物视频在线| 日韩av资源在线| 日韩精品一级二级| 欧美18视频| 伊甸园亚洲一区| 欧美lavv| 在线视频精品| 97欧美精品一区二区三区| 试看120秒一区二区三区| 成人午夜天堂| 国产小视频91| 日韩和的一区二在线| 国产综合18久久久久久| 久久精品国产精品亚洲精品| 韩国黄色一级大片| 亚洲色图在线看| caoporn国产精品免费视频| 欧美三级日韩三级| 99久久久成人国产精品| 天堂8在线天堂资源bt| 91亚洲大成网污www| 超碰在线免费观看97| 亚洲伊人观看| 国产在线视频网站| 欧美性猛交丰臀xxxxx网站| 在线观看国产中文字幕| 日本高清免费不卡视频| 蜜臀av亚洲一区中文字幕| 精品无码久久久久久久动漫| 91大神在线观看线路一区| 91tv亚洲精品香蕉国产一区7ujn| 天天躁日日躁狠狠躁欧美巨大小说 | 蜜桃视频一区二区在线观看| 精品成人免费| 成年人免费观看的视频| 国产91亚洲精品一区二区三区| 欧美色视频日本高清在线观看| 国产网站在线| 在线无限看免费粉色视频| 亚洲第一精品夜夜躁人人躁| 成人系列视频| 国产精品入口日韩视频大尺度| 亚洲三级电影全部在线观看高清| 日韩一级淫片| 干日本少妇首页| 亚洲人线精品午夜| 欧美不卡高清一区二区三区| 中国成人在线视频| 性色av一区二区三区| 狠狠色香婷婷久久亚洲精品| 久久av色综合| 欧美电影一区二区| 外国成人毛片| 国产精品啪啪啪视频| 日韩精品影音先锋| 欧美女优在线| 欧美一级黄色网| 欧美一级二级三级乱码| 高清不卡一区二区| 日日骚欧美日韩| 电影亚洲一区| 亚洲国产伊人| 波多野结衣 作品| 日韩欧美不卡一区| 99久久99久久免费精品蜜臀| 亚洲黄色网址在线观看| 国产一区二区精品丝袜| 久久国产精品区| 57pao成人永久免费| 日韩国产精品一区| 四虎影视国产精品| av免费精品一区二区三区| 精品写真视频在线观看| 九七影院97影院理论片免费| 欧美性色aⅴ视频一区日韩精品| 天堂√8在线中文| 欧洲亚洲妇女av| 蜜桃av噜噜一区| 97影院理论片在线播放| 日韩一区二区三免费高清| swag国产精品一区二区| 国产亚洲精品自在久久| 久久网站最新地址| 91小视频xxxx网站在线| 国产91色在线|| 懂色一区二区三区免费观看| 欧美女子与性| 国产91精品久| 成人网页在线观看| 黄色免费网站在线观看| 国产脚交av在线一区二区| 国产精品一区三区| 最近高清中文在线字幕在线观看| 欧美猛男性生活免费| 久久99蜜桃精品| 黄色大片在线免费观看| 68精品国产免费久久久久久婷婷 | 欧美日本三级| 婷婷四月色综合| 精品久久久中文| 成人另类视频| wwwwww欧美| 欧美mv和日韩mv的网站| 中文字幕亚洲精品乱码 | www.亚洲一区二区| 一本一道波多野结衣一区二区| 日韩一区网站| a级免费在线观看| 亚洲精品99999| 久久综合图片| 精品黄色免费中文电影在线播放| 国产精品永久免费观看| 成人欧美一区二区三区白人| 97精品资源在线观看| 国产一区二区三区乱码| 亚洲精品国产品国语在线| 免费在线成人| 欧美日韩国产精品一区二区三区四区 | 国产人妻777人伦精品hd| 精品视频123区在线观看| 欧美美女在线| 中文字幕免费中文| 欧美国产亚洲精品久久久8v| 97久久超碰国产精品| 素人啪啪色综合| 久久亚洲国产成人精品无码区 | 99re久久最新地址获取| 成人亚洲一区二区三区| 国内精品小视频| 国产欧美日韩在线看| 国产成年精品| 日本黄网站免费| 美女福利精品视频| 久久精品视频免费| 亚洲一二av| 成人嫩草影院免费观看| 91福利视频在线观看| 亚洲视频资源在线| 国产精品亚洲片在线播放| 最新二区三区av| 成人午夜小视频| 欧美视频在线不卡| 日精品一区二区| 亚洲第一二三四区| 日韩激情免费视频| 午夜欧美大片免费观看| 一级女性全黄久久生活片免费| 精品国产午夜| 蜜桃视频在线观看视频| 麻豆传媒一区| 日韩高清不卡av| av一区二区不卡| 另类尿喷潮videofree| 91原色影院| 亚洲综合第一页| 欧美一级午夜免费电影| 亚洲va久久久噜噜噜久久| 精品视频无码一区二区三区| 91av在线国产| 香蕉久久一区二区不卡无毒影院| 欧美成熟视频| jizz一区二区三区| 男女激情无遮挡| 国产做受69高潮| 在线观看一区不卡| 国产美女主播视频一区| aaa国产精品| 在线视频2区| 视频一区二区在线| 欧美成人激情在线| 亚洲线精品一区二区三区| 一本色道久久| 国产乱码精品一区二区三区亚洲人| 天海翼女教师无删减版电影| 欧美高清视频一区|