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

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

Я пробовал много способов, но у меня всегда были проблемы с этим.

Когда я пишу этот код:

func peoplePickerNavigationController(peoplePicker: ABPeoplePickerNavigationController!, didSelectPerson person: ABRecord!) {
    var emails: ABMultiValueRef = ABRecordCopyValue(person, kABPersonEmailProperty) as! ABMultiValueRef
    var countEmails = ABMultiValueGetCount(emails)

Я получаю такую ​​ошибку:

Could not cast value of type 'Swift.Unmanaged<Swift.AnyObject>' (0x7f9f12db3c88) to 'Swift.AnyObject'

Спасибо за ответы

0
Karz 7 Июл 2015 в 16:24

2 ответа

Вы ориентируетесь на iOS 9? Некоторые из этих API устарели.

  • kABPersonEmailProperty должно быть CNContact.emailAddresses
  • ABMultiValueRef должно быть [CNLabeledValue]
0
Mundi 7 Июл 2015 в 16:38

Используйте этот код, чтобы получить все адреса электронной почты в массиве

let emailProperty: ABMultiValueRef = ABRecordCopyValue(record, kABPersonEmailProperty).takeRetainedValue() as ABMultiValueRef        

let allEmailIDs: NSArray = ABMultiValueCopyArrayOfAllValues(emailProperty).takeUnretainedValue() as NSArray

for email in allEmailIDs 
{            
    let emailID = email as String
    println ("contactEmail : \(emailID) :=>")
}

Если вы хотите проверить количество сообщений электронной почты, используйте

let allEmailIDs: NSArray = ABMultiValueCopyArrayOfAllValues(emailProperty).takeUnretainedValue() as NSArray

Поэтому я добавил проверку прямо перед тем, чтобы убедиться, что есть какие-либо электронные письма.

if ABMultiValueGetCount(emailProperty) > 0 {
  let allEmailIDs: NSArray = ABMultiValueCopyArrayOfAllValues(emailProperty).takeUnretainedValue() as NSArray
}
0
BKjadav 7 Июл 2015 в 16:52