使用 ABPersonCopyImageData 获取 iOS 联系人图像
Get iOS contact image with ABPersonCopyImageData
我正在尝试读取我的 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
并且不显示任何错误消息。
我做错了什么?
我正在使用模拟器默认联系人对其进行测试,它们没有图像,但有占位符 his/her 名字的第一个字母。
已编辑:
我已将代码更改为
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")
}
并且在控制台上所有联系人都没有图像:
控制台输出:
凯特没有形象
大牛无图
约翰没有形象
安娜没有形象
汉克无像
没有图像的大卫
它没有显示联系方式的图片,但我给约翰加了一张。
AddressBook
框架是与 Swift 一起使用时非常讨厌的框架之一。首先,我要指出 iOS 9 中有一个新的 Contacts 框架,如果您可以选择不支持 8 和更早版本(AddressBook
已弃用,我建议您使用它截至 iOS 9).
话虽如此,函数 ABPersonCopyImageData(ABRecord!)
return 的值类型为 Unmanaged<CFData>!
,这意味着它可能是 nil
值(它确实应该是 Unmanaged<CFData>?
,但我认为 Apple 没有费心去修复 AddressBook 类型,因为他们正在研究 Contacts
框架。鉴于它可以而且将会 return 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
}
注意:稍后在您的代码中,您在创建 Contato
实例时强制解包 imagemContato
。您将必须处理它是 nil
值的情况,否则当您这样做时您的程序可能会崩溃。
我之前在项目中遇到的相同问题。
试试这个,
//获取图片
let img = ABPersonCopyImageDataWithFormat(person, kABPersonImageFormatThumbnail).takeRetainedValue()
//在你的ImageView中设置图片
YourImageView.image=UIImage(data: img as! NSData)
我用
解决了它
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")
}
这是正确的方法吗?
我正在尝试读取我的 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
并且不显示任何错误消息。
我做错了什么?
我正在使用模拟器默认联系人对其进行测试,它们没有图像,但有占位符 his/her 名字的第一个字母。
已编辑:
我已将代码更改为
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")
}
并且在控制台上所有联系人都没有图像:
控制台输出: 凯特没有形象 大牛无图 约翰没有形象 安娜没有形象 汉克无像 没有图像的大卫
它没有显示联系方式的图片,但我给约翰加了一张。
AddressBook
框架是与 Swift 一起使用时非常讨厌的框架之一。首先,我要指出 iOS 9 中有一个新的 Contacts 框架,如果您可以选择不支持 8 和更早版本(AddressBook
已弃用,我建议您使用它截至 iOS 9).
话虽如此,函数 ABPersonCopyImageData(ABRecord!)
return 的值类型为 Unmanaged<CFData>!
,这意味着它可能是 nil
值(它确实应该是 Unmanaged<CFData>?
,但我认为 Apple 没有费心去修复 AddressBook 类型,因为他们正在研究 Contacts
框架。鉴于它可以而且将会 return 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
}
注意:稍后在您的代码中,您在创建 Contato
实例时强制解包 imagemContato
。您将必须处理它是 nil
值的情况,否则当您这样做时您的程序可能会崩溃。
我之前在项目中遇到的相同问题。 试试这个,
//获取图片
let img = ABPersonCopyImageDataWithFormat(person, kABPersonImageFormatThumbnail).takeRetainedValue()
//在你的ImageView中设置图片
YourImageView.image=UIImage(data: img as! NSData)
我用
解决了它 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")
}
这是正确的方法吗?