小编use*_*648的帖子

使用Swift访问iOS通讯簿:数组计数为零

我正在尝试编写一种简单的方法来要求用户访问他们的地址簿,然后在地址簿中打印出每个人的姓名.我已经看过一些教程,解释了如何在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)

abaddressbook ios swift

45
推荐指数
3
解决办法
2万
查看次数

标签 统计

abaddressbook ×1

ios ×1

swift ×1