【问题标题】:IOS Swift AddressBook ContactsIOS Swift 通讯录联系人
【发布时间】:2015-08-11 11:17:03
【问题描述】:

我有一个奇怪的问题,我正在尝试从 IOS 通讯录 API 获取所有联系人,同时我正在尝试获取属性的所有值(我正在获取的每个联系人的名字、姓氏、电子邮件和电话号码“致命错误:在展开可选值时意外发现 nil”),就在我在我的设备上运行命令时,但是当我在 xcode 模拟器上运行命令时一切正常?

这是我的示例代码:

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)")

    }
}

【问题讨论】:

  • 你用swift2 标记了这个,但我在你的代码块中看到println 而不是Swift2 的print。您使用的是哪个版本的 Xcode?另外,崩溃发生在哪一行?
  • 要求用户访问他们的通讯录在这里得到很好的回答stackoverflow.com/questions/24752627/…

标签: swift2


【解决方案1】:

您可能会发现问题在于您对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)

结果变量是隐含的可选项,但它们不会导致展开错误。上面的函数可以很容易地按照 iOS 9 / Xcode 7 中的新联系人框架的方式重新设计成一个类结构

【讨论】:

  • 用户声称他的代码在模拟器上运行良好。应该是平台和隐私设置的问题。
  • @Prabhu.Somasundaram 是错误的:它与平台和隐私设置无关,而与数据库中的实际数据有关。它可能在模拟器中工作的原因是测试数据库中的所有条目都有名字和姓氏,因此没有发生故障。实时通讯簿可能包含没有名字的记录,这会导致问题。使用“作为!”反对 nil 会引发异常:如果名字或姓氏为 nil,则会崩溃。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多