【问题标题】:Display AddressBook contacts doesn't work显示通讯簿联系人不起作用
【发布时间】:2014-11-26 08:11:36
【问题描述】:

我正在获取我的 iOS 通讯录联系人,并将它们存储在一个名为 contacts[] 的数组中。

这是我的方法:

 var contacts: [String] = []

 func getContactNames() {
    if !self.determineStatus() {
        println("not authorized")
        return
    }
    let people = ABAddressBookCopyArrayOfAllPeople(adbk).takeRetainedValue() as NSArray as [ABRecord]
    for person in people {
        self.contacts.append(ABRecordCopyCompositeName(person).takeRetainedValue())
    }
}

这很好用,我将它们显示在一个不错的 UITableView 中。它在模拟器(iOS 8.1)中运行良好,但在我的 iPhone 上运行良好。 在我的手机上,我收到了著名的错误:

 fatal error: unexpectedly found nil while unwrapping an Optional value

问题是我在这里没有使用可选项。经过不同的测试,我发现只有当我的联系人列表中的联系人超过 26 个时才会出现此错误。

很奇怪,26 也是字母表中的字母数,所以我正在朝那个方向搜索。

你有什么线索吗?我会很感激你的帮助。谢谢

PS:在调试屏幕中,它似乎来自这一行:

let people = ABAddressBookCopyArrayOfAllPeople(adbk).takeRetainedValue() as NSArray as [ABRecord]

【问题讨论】:

  • 有什么发现吗?有同样的问题
  • 使用 iOS9 浏览联系人的方式完全改变了。有一个名为 Contacts 的新框架,它取代了旧的地址簿框架。 Doc here

标签: ios xcode swift


【解决方案1】:

将这一行分解为单个语句并检查哪一个导致了问题。

例如:

let a = adbk let b = ABAddressBookCopyArrayOfAllPeople(adobe) let c = b.takeRetainedValue() let d = c as [ABRecord]

检查每个变量,你会发现它:)

在 Swift 中,您还可以将变量声明为 Implicitly unwrapped optional type,即声明为 let a: Type!(带有感叹号)。这基本上意味着变量可以为 nil(您无需在构造函数中对其进行初始化),但您保证在应用程序的生命周期内它永远不会包含 nil。引入这个机制主要是为了保持 Objective-C 的兼容性,但它有时会导致一些意想不到的nil 相关错误。

【讨论】:

    猜你喜欢
    • 2011-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多