2017-02-21 3 views
2

Я хочу именно этот процесс в своем приложении https://www.youtube.com/watch?v=HKCXwm7r838. Но код в этом учебнике предназначен для более старой версии IOS, я использую IOS 10, Xcode 8.2, Swift 3.0, поэтому он не работает для меня. Я попробовал следующий код для отображения списка контактов. Оно работает.Получение имени и номера людей с мобильного контакта в IOS

import UIKit 
import ContactsUI 
class ViewController: UIViewController, CNContactPickerDelegate{ 

    @IBOutlet weak var textLabel: UILabel! 
    override func viewDidLoad() 
    { 
     super.viewDidLoad() 

    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 

    } 
    func addExistingContact() 
    { 

    } 
    func contactPicker(picker: CNContactPickerViewController, didSelectContact contacts: CNContact) 
    { 
     // print(contacts.givenName) 

    } 

    @IBAction func button(_ sender: Any) 
    { 
     let contactPicker = CNContactPickerViewController() 
     contactPicker.delegate = self 
     contactPicker.displayedPropertyKeys = 
      [CNContactGivenNameKey 
       , CNContactPhoneNumbersKey] 
     self.present(contactPicker, animated: true, completion: nil) 
    } 

    func contactPickerDidCancel(picker: CNContactPickerViewController) 
    { 
     print("Cancel Contact Picker") 
    } 
} 

Теперь, что я хочу, когда я выбрать любое имя контакта из списка, список контактов должны исчезнуть сразу, а затем выбранное имя и номер должны отображаться в двух этикеток/TextFields в ViewController. Может кто-нибудь сказать мне, какой код я должен использовать? Заранее спасибо.

ответ

3

Заменить Методы contactPicker(picker: CNContactPickerViewController, didSelectContact contacts: CNContact) и contactPickerDidCancel(picker: CNContactPickerViewController) с

func contactPicker(_ picker: CNContactPickerViewController, 
       didSelect contactProperty: CNContactProperty) { 

} 

func contactPicker(_ picker: CNContactPickerViewController, didSelect contact: CNContact) { 
    // You can fetch selected name and number in the following way 

    // user name 
    let userName:String = contact.givenName 

    // user phone number 
    let userPhoneNumbers:[CNLabeledValue<CNPhoneNumber>] = contact.phoneNumbers   
    let firstPhoneNumber:CNPhoneNumber = userPhoneNumbers[0].value 

    // user phone number string 
    let primaryPhoneNumberStr:String = firstPhoneNumber.stringValue 
} 

func contactPickerDidCancel(_ picker: CNContactPickerViewController) { 

} 

Учитывая, что ваше требование для ContactPicker закрыть сразу после нажатия на контакт, вы не должны реализовать следующие методы. Удалите приведенные ниже методы из кода.

func contactPicker(_ picker: CNContactPickerViewController, didSelect contacts: [CNContact]) { 

} 

func contactPicker(_ picker: CNContactPickerViewController, didSelectContactProperties contactProperties: [CNContactProperty]) { 

} 
+0

не могли бы вы рассказать мне, какой код я должен использовать внутри этих методов, чтобы немедленно закрыть список контактов, когда я нажму любое имя контакта. И это выбранное имя и номер должны быть напечатаны. – Tester

+0

@ Тестер, я считаю, что мой текущий отредактированный ответ решает проблему. Пожалуйста, дайте мне знать, если я пропустил что-то. – KrishnaCA

+0

Большое вам спасибо. Оно работает. – Tester

1

Я расскажу вам, как получить ваш список контактов. В последней части вашего сообщения (список) вам придется делать это самостоятельно, так как он просто играет с контроллерами TableView. Первый импорт:

import Contacts 

Я использую это, например, чтобы получить все мои контакты:

let store = CNContactStore() 
     var contacts = [CNContact]() 
     let keys = [CNContactFormatter.descriptorForRequiredKeys(for: .fullName), CNContactSocialProfilesKey] as [Any] 
     let request = CNContactFetchRequest(keysToFetch: keys as! [CNKeyDescriptor]) 


     do{ 
      try store.enumerateContacts(with: request){ 
       (contact, stop) in 
        contacts.append(contact) 
      } 

      guard contacts.count > 0 else{ 
       //Show contact list 
       return 
      } 
     } catch let err{ 
      print(err) 
     } 

Кроме того, где-то в вашем коде, вы хотите спросить Контакты Разрешение:

switch CNContactStore.authorizationStatus(for: .contacts){ 
         case .authorized: 
          // 
         case .notDetermined: 
          store.requestAccess(for: .contacts){succeeded, err in 
           guard err == nil && succeeded else{ 
            return 
           } 
          } 
         case .denied: 
          // 
         case .restricted: 
          // 
         default: 
          print("Not handled") 
        } 

ВАЖНО: Добавить в вашем info.plist:

Privacy - Contacts Usage Description 
+0

Я получил своего чувака-адресата, используя код в сообщении. Я хочу выбрать только одно имя контакта. И это имя и номер выбранного контакта должны быть напечатаны, в то же время список контактов должен исчезнуть. – Tester

Смежные вопросы