用ABPersonCopyImageData获取iOS联系人图像
我试图阅读我的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) } }
但是当我debugging它,停止:
let data = ABPersonCopyImageData(person).takeRetainedValue() as NSData
并不显示任何错误消息。
我究竟做错了什么?
我使用模拟器的默认联系人来testing它,他们没有图像,但占位符与他/她的名字的第一个字母。
编辑:
我已经改变了代码
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") }
并在控制台上的所有联系人没有图像:
控制台输出: 凯特没有图像丹尼尔没有图像约翰没有图像安娜没有图像汉克没有图像大卫没有图像
它没有显示联系人的图像,但我添加了一个约翰。
我之前在项目中遇到的同样的问题。 尝试这个,
//获取图像
let img = ABPersonCopyImageDataWithFormat(person, kABPersonImageFormatThumbnail).takeRetainedValue()
//在ImageView中设置图片
YourImageView.image=UIImage(data: img as! NSData)
AddressBook
框架是与Swift一起使用的框架之一。 首先我会指出iOS 9中有一个新的联系人框架,如果您有不支持8和更早版本的选项,我build议您使用这个框架(从iOS 9开始不推荐使用AddressBook
)。
话虽如此,functionABPersonCopyImageData(ABRecord!)
返回一个值的typesUnmanaged<CFData>!
,这意味着它可能是一个nil
值(它确实应该是Unmanaged<CFData>?
但我认为苹果公司并没有打扰修复AddressBooktypes,因为他们正在Contacts
框架上工作。可以并将返回nil
,你需要把它当作nil
即使它是一个隐式的解包types。
更改:
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 }
注意 :稍后在您的代码中,您在创buildimagemContato
实例时强制展开imagemContato
。 你将不得不处理一个nil
值的情况,否则当你这样做的时候你的程序可能会崩溃。
我解决了它使用
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") }
这是正确的方法吗?