显示AddressBook联系人不起作用

时间:2014-11-26 08:11:37

标签: ios xcode swift

我正在获取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]

1 个答案:

答案 0 :(得分:1)

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

E.g:

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相关错误。