2015-08-11 2 views
1

У меня есть странная проблема, я пытаюсь получить все контакты из API-адрес API IOS, в то время как я пытаюсь получить все значения свойств (имя, фамилия, электронные письма и номера телефонов каждого контакта Я getting «фатальная ошибка: неожиданно найденная nil при распаковке необязательного значения»), только когда я запускаю команду на своем устройстве, но когда я запускаю команду на симуляторе xcode, все работает нормально?IOS Swift AddressBook Контакты

вот мой пример кода:

func getContactNames() { 

     let people = ABAddressBookCopyArrayOfAllPeople(addressBook).takeRetainedValue() as NSArray 



     for person in people { 


     let firstName = ABRecordCopyValue(person, 
       kABPersonFirstNameProperty).takeRetainedValue() as! String 

     let lastName = ABRecordCopyValue(person, 
       kABPersonLastNameProperty).takeRetainedValue() as! String 


     let email: ABMultiValueRef = ABRecordCopyValue(person,kABPersonEmailProperty).takeRetainedValue() 

     println("First name = \(firstName)") 
     println("Last name = \(lastName)") 
     println("Email = \(email)") 

    } 
} 
+1

вы отметили это с помощью 'swift2', но я вижу' println' вместо Swift2 'print' в вашем коде блок. Какую версию Xcode вы используете? Кроме того, на какой линии происходит крах? –

+0

Запросить у пользователя доступ к их адресной книге Хорошо ответил здесь http://stackoverflow.com/questions/24752627/accessing-ios-address-book-with-swift-array-count-of-zero –

ответ

0

Вы можете найти проблема с использованием as! String. Если какие-либо записи в вашей адресной книге не имеют имени или фамилии, то вы пытаетесь сохранить nil, следовательно, ошибку.

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

public func stringPropertyValue(record: ABRecord, id:ABPropertyID) -> String! { 
    var result: String! = nil 
    if let v = ABRecordCopyValue(record, id) { 
     result = v.takeRetainedValue() as! String 
    } 
    return result 
} 

вы можете настроить переменные, как это:

let firstName = stringPropertyValue(person, id:kABPersonFirstNameProperty) 
let lastName = stringPropertyValue(person, id:kABPersonLastNameProperty) 

Полученные переменные подразумеваемые УСТРОЙСТВА, но они выиграли 't вызывают ошибки развертки. Вышеупомянутая функция может быть легко переработана в структуру класса по линиям новой структуры контактов в iOS 9/Xcode 7

+0

Пользователь утверждает, что его код отлично работал с симулятором. Это должно быть проблемой с настройками платформы и конфиденциальности. –

+0

Спасибо за решение, отлично работает !!! –

+0

@ Prabhu.Somasundaram не прав: он не имеет ничего общего с настройками платформы и конфиденциальности и все, что связано с фактическими данными в базе данных. Причина, по которой он, вероятно, работал в симуляторе, состоит в том, что все записи в тестовой базе данных имели имена и фамилии, поэтому ошибка не возникала. Живые адресные книги, вероятно, содержат записи, которые не имеют первых ** и ** фамилий, и это вызывает проблему. Использование «как!» против nil выбрасывает исключение: если первое или последнее имя nil, оно сбой. – pbc

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