我正在尝试编写一种简单的方法来要求用户访问他们的地址簿,然后在地址簿中打印出每个人的姓名.我已经看过一些教程,解释了如何在Objective-C中做到这一点,但我很难将它们转换为swift.
这是我到目前为止所做的.下面的块在我的viewDidLoad()方法中运行,并检查用户是否具有对地址簿的授权访问权限,如果他们尚未授权访问,则第一个if语句将要求访问.此部分按预期工作.
var emptyDictionary: CFDictionaryRef?
var addressBook: ABAddressBookRef?
if (ABAddressBookGetAuthorizationStatus() == ABAuthorizationStatus.NotDetermined)
{
println("requesting access...")
addressBook = !ABAddressBookCreateWithOptions(emptyDictionary,nil)
ABAddressBookRequestAccessWithCompletion(addressBook,{success, error in
if success {
self.getContactNames();
}
else
{
println("error")
}
})
}
}
else if (ABAddressBookGetAuthorizationStatus() == ABAuthorizationStatus.Denied || ABAddressBookGetAuthorizationStatus() == ABAuthorizationStatus.Restricted)
{
println("access denied")
}
else if (ABAddressBookGetAuthorizationStatus() == ABAuthorizationStatus.Authorized)
{
println("access granted")
getContactNames()
}
Run Code Online (Sandbox Code Playgroud)
一旦我知道用户已授予访问权限,我就运行下面的getContactNames()方法.经过多次来回,我终于能够通过添加takeRetainedValue()方法来编译它,以便将ABAddressBookCopyArrayOfAllPeople返回的数组从非托管数组转换为托管数组,这样我就可以将CFArrayRef转换为NSArray的.
我遇到的问题是contactList数组最终的计数为0,因此for循环被跳过.在我的模拟器中,地址簿有6或7条记录,所以我希望该数组具有该长度.有任何想法吗?
func getContactNames()
{
addressBook = !ABAddressBookCreateWithOptions(emptyDictionary,nil)
var contactList: NSArray = ABAddressBookCopyArrayOfAllPeople(addressBook).takeRetainedValue()
println("records in the array \(contactList.count)") // returns 0
for record:ABRecordRef in …Run Code Online (Sandbox Code Playgroud)