Как перечислить электронные письма рядом с именами в CNContactPickerViewController?
Я создаю CNContactPickerViewController следующим образом:
private var newpicker : CNContactPickerViewController? {
let p = CNContactPickerViewController()
p.displayedPropertyKeys = [ CNContactGivenNameKey, CNContactFamilyNameKey, CNContactEmailAddressesKey ]
p.predicateForEnablingContact = NSPredicate(format: "%K.@count > 0", CNContactEmailAddressesKey)
p.delegate = self
return p
}
отображаются только имена, если у контакта нет ни одного (в этом случае отображается электронная почта)
Как я могу получить CNContactPickerViewController, чтобы показать электронное письмо рядом с именами в таблице контактов, отображаемой этим средством выбора?
1 ответ
Ты не можешь.
Опираясь на это: Swift iOS9 New Contacts Framework - Как получить только CNContact, который имеет действительный адрес электронной почты?
//
// ContactsTableViewController.swift
import UIKit
import Contacts
import sharedEnchantment
// word by word CNContactPickerDelegate
@available(iOS 9.0, *)
protocol ContactPickerDelegate : NSObjectProtocol {
/*!
* @abstract Invoked when the picker is closed.
* @discussion The picker will be dismissed automatically after a contact or property is picked.
*/
func contactPickerDidCancel(picker: ContactsPickerTableViewController)
/*!
* @abstract Singular delegate methods.
* @discussion These delegate methods will be invoked when the user selects a single contact or property.
*/
func contactPicker(picker: ContactsPickerTableViewController, didSelectContact contact: CNContact)
}
@available(iOS 9.0, *)
class ContactsPickerTableViewController: UITableViewController {
let keysToFetch = [CNContactGivenNameKey, CNContactFamilyNameKey, CNContactEmailAddressesKey]
let contactStore = CNContactStore()
var contacts : [CNContact] = []
/*!
* @abstract The delegate to be notified when the user selects a contact or property.
*/
weak var delegate: ContactPickerDelegate?
override func viewDidLoad() {
title = "Email Contacts".localized
super.viewDidLoad()
self.navigationController!.navigationBar.barTintColor = UIColor.whiteColor()
navigationItem.backBarButtonItem = nil
navigationItem.leftBarButtonItem = UIBarButtonItem(title: "Cancel", style: UIBarButtonItemStyle.Done,
target: self, action: #selector(TimeLineVC.cancelAndExitView(_:)))
tableView.bounces = false
do {
try contactStore.enumerateContactsWithFetchRequest(CNContactFetchRequest(keysToFetch: keysToFetch)) {
[weak self] (contact, cursor) -> Void in
if let rawEmail = contact.emailAddresses.first,
let email = rawEmail.value as? String where email.isValidEmail() {
self?.contacts.append(contact)
}
}
}
catch{
alert("contact retrieval has failed")
}
}
func cancelAndExitView(sender: UIBarButtonItem) {
dismissViewControllerAnimated(true) { [unowned self] in
self.delegate?.contactPickerDidCancel(self)
}
}
// MARK: - Table view data source
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return contacts.count
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let ident = "subtitle"
var cell : UITableViewCell! = tableView.dequeueReusableCellWithIdentifier(ident)
if cell == nil {
cell = UITableViewCell(style: .Subtitle, reuseIdentifier: ident)
}
let contact = contacts[indexPath.row]
cell.textLabel?.text = contact.givenName + " " + contact.familyName // this breaks in some locales
guard let rawEmail = contact.emailAddresses.first else {
cell.detailTextLabel?.text = "contacts.error".localized
return cell
}
let email = rawEmail.value as? String ?? ""
cell.detailTextLabel?.text = email
return cell
}
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
let contact = contacts[indexPath.row]
dismissViewControllerAnimated(true) { [unowned self] in
self.delegate?.contactPicker(self, didSelectContact: contact)
}
}