使用ABPersonCopyImageData

时间:2015-10-03 15:35:32

标签: ios swift abaddressbook

我试图阅读我的iOS地址簿的联系人图片,但我遇到了一些麻烦。

我有一个方法可以读取ABAddressBookRef的联系人信息并将其放在结构上。

func readContacts(addressBook: ABAddressBookRef){
        let allPeople = ABAddressBookCopyArrayOfAllPeople(addressBookRef).takeRetainedValue() as NSArray
        var numeros : [Numeros] = []

        //lendo todos os contatos
        for person: ABRecordRef in allPeople{

            let firstName = ABRecordCopyValue(person, kABPersonFirstNameProperty).takeRetainedValue() as! String
            let lastName = ABRecordCopyValue(person, kABPersonLastNameProperty).takeRetainedValue() as! String

            let phones : ABMultiValueRef = ABRecordCopyValue(person, kABPersonPhoneProperty).takeUnretainedValue() as ABMultiValueRef

            let data = ABPersonCopyImageData(person).takeRetainedValue() as NSData
            let imagemContato = UIImage(data: data)

            for(var numberIndex : CFIndex = 0; numberIndex < ABMultiValueGetCount(phones); numberIndex++) {
                let phoneUnmaganed = ABMultiValueCopyValueAtIndex(phones, numberIndex)

                let phoneNumber : NSString = phoneUnmaganed.takeUnretainedValue() as! NSString

                let locLabel : CFStringRef = (ABMultiValueCopyLabelAtIndex(phones, numberIndex) != nil) ? ABMultiValueCopyLabelAtIndex(phones, numberIndex).takeUnretainedValue() as CFStringRef : ""

                let cfStr:CFTypeRef = locLabel
                let nsTypeString = cfStr as! NSString
                let swiftString:String = nsTypeString as String

                //let customLabel = String (stringInterpolationSegment: ABAddressBookCopyLocalizedLabel(locLabel))

                let numero: Numeros = Numeros(tipoNumero: swiftString, numero: phoneNumber as String)

                numeros.append(numero)

            }

            let registroContato: Contato = Contato(primeiroNome: firstName, ultimoNome: lastName, contatoRecord: person, numeros: numeros, imagemContato: imagemContato!)

            contatos.append(registroContato)

        }
    }

但是当我调试它时,它会停止:

let data = ABPersonCopyImageData(person).takeRetainedValue() as NSData

并且不会显示任何错误消息。

我做错了什么?

我使用模拟器默认联系人来测试它,他们没有图像,但是占位符上有他/她的名字的第一个字母。

编辑:

我已将代码更改为

let imagemContato: UIImage?
            if let data = ABPersonCopyImageData(person)?.takeRetainedValue() as? NSData     {
                print("\(firstName) with image")
                imagemContato = UIImage(data: data)
            }
            else {
                print("\(firstName) without image")
                imagemContato = UIImage(named: "UooQo.jpg")
            }

并且在控制台上所有联系人都没有图像:

控制台输出: 没有形象的凯特 丹尼尔没有形象 约翰没有形象 安娜没有形象 汉克没有形象 没有形象的大卫

它没有显示联系人的图像,但我向John添加了一个。 contact image

3 个答案:

答案 0 :(得分:4)

AddressBook框架是与Swift一起使用时非常讨厌的框架之一。首先,我要指出iOS 9中有一个新的Contacts框架,如果您可以选择不支持8及更早版本,我建议您使用它(AddressBook已弃用iOS 9)。

话虽如此,函数ABPersonCopyImageData(ABRecord!)返回一个类型为Unmanaged<CFData>!的值,这意味着它可能是nil值(它确实应该是{ {1}},但我认为Apple并不打扰修复AddressBook类型,因为他们正在使用Unmanaged<CFData>?框架。鉴于它可以而且将返回Contacts,您可以使用nil。我需要像对待它nil那样对待它,即使它是隐式展开的类型。

变化:

let data = ABPersonCopyImageData(person).takeRetainedValue() as NSData
let imagemContato = UIImage(data: data)

为:

let imagemContato: UIImage?
if let data = ABPersonCopyImageData(person)?.takeRetainedValue() as? NSData     {
    imagemContato = UIImage(data: data)
}
else {
    imagemContato = nil
}

注意:在您的代码中稍后,您在创建imagemContato实例时强制解包Contato。您必须处理nil值的情况,否则当您执行此操作时程序可能会崩溃。

答案 1 :(得分:1)

我之前在项目中遇到的同样问题。 试试这个,

//获取图片

   let img = ABPersonCopyImageDataWithFormat(person, kABPersonImageFormatThumbnail).takeRetainedValue()

//在ImageView中设置图像

YourImageView.image=UIImage(data: img as! NSData)

答案 2 :(得分:0)

我用

解决了这个问题
        let imagemContato: UIImage?
        let imgData: CFData?

        if ABPersonHasImageData(person) {
            imgData = ABPersonCopyImageDataWithFormat(person, kABPersonImageFormatThumbnail).takeRetainedValue()
            imagemContato = UIImage(data: imgData!)
        }else{
            //placeholder
            imagemContato = UIImage(named: "UooQo.jpg")
        }

这是正确的方法吗?