gpt4 book ai didi

ios - 使用 ABPersonCopyImageData 获取 iOS 联系人图像

转载 作者:可可西里 更新时间:2023-11-01 00:37:15 27 4
gpt4 key购买 nike

我正在尝试读取我的 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

最佳答案

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

话虽如此,函数ABPersonCopyImageData(ABRecord!)返回类型为 Unmanaged<CFData>! 的值,这意味着它可能是一个 nil值(它确实应该是 Unmanaged<CFData>? ,但我认为 Apple 没有费心修复 AddressBook 类型,因为他们正在研究 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 的情况。值,否则当您这样做时您的程序可能会崩溃。

关于ios - 使用 ABPersonCopyImageData 获取 iOS 联系人图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32924341/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com