如何使用SwiftUI在iOS上获取和显示联系人照片?
我有一个运行脚本,可以在iOS上用SwiftUI读取和显示所有联系人,但我也很难显示联系人图像。调试代码时,所有联系人的imageData都似乎为空,而hasImageData为false。一般来说,联系人是从谷歌同步到iPhone的,但出于测试目的,我在iPhone上添加了一些照片到一些联系人,结果相同——没有结果 希望任何人都知道出了什么问题:-)如何使用SwiftUI在iOS上获取和显示联系人照片?,swiftui,Swiftui,我有一个运行脚本,可以在iOS上用SwiftUI读取和显示所有联系人,但我也很难显示联系人图像。调试代码时,所有联系人的imageData都似乎为空,而hasImageData为false。一般来说,联系人是从谷歌同步到iPhone的,但出于测试目的,我在iPhone上添加了一些照片到一些联系人,结果相同——没有结果 希望任何人都知道出了什么问题:-) 导入快捷界面 导入联系人 结构FetchedContact{ 变量id:String var firstName:String var las
导入快捷界面
导入联系人
结构FetchedContact{
变量id:String
var firstName:String
var lastName:String
var电话:字符串
}
func getContacts()->[FetchedContact]{
变量联系人=[FetchedContact]()
let store=CNContactStore()
中的store.requestAccess(对于:。联系人){(已授予,错误)
如果let error=error{
打印(“请求访问失败”,错误)
返回
}
如果允许的话{
let keys=[CNContactGivenNameKey,CNContactFamilyNameKey,CNContactPhoneNumbersKey]
let request=CNContactFetchRequest(keystefetch:keys作为[CNKeyDescriptor])
做{
请尝试在中使用store.enumerateContacts(with:request,usingBlock:{(contact,stopPointer))
contacts.append(FetchedContact(id:contact.identifier,firstName:contact.givenName,lastName:contact.familyName,电话:contact.phoneNumbers.first?.value.stringValue???))
})
}捕捉错误{
打印(“枚举联系人失败”,错误)
}
}否则{
打印(“访问被拒绝”)
}
}
联系人。排序{
$0.firstName<$1.firstName
}
联系人。排序{
$0.lastName<$1.lastName
}
返回联系人
}
结构ContactListView:视图{
@状态变量contacts=[FetchedContact]()
var body:一些观点{
VStack{
按钮(操作:{
self.contacts=getContacts()
}) {
文本(“更新联系人”)
}
.padding()
文本(“找到\(self.contacts.count)个联系人”)
.padding()
列表(self.contacts,id:\.id){中的联系人
文本(“\(contact.lastName),\(contact.firstName)”)
}
.padding(.vertical)
}
.navigationTitle(“联系人列表视图”)
}
}
结构ContactListView\u预览:PreviewProvider{
静态var预览:一些视图{
导航视图(){
ContactListView()
}
}
}
解决方案:
这是否回答了您的问题?是的,事实上我没有向请求中添加相应的键-谢谢:-)
import SwiftUI
import Contacts
struct FetchedContact {
var id: String
var firstName: String
var lastName: String
var telephone: String
}
func getContacts() -> [FetchedContact] {
var contacts = [FetchedContact]()
let store = CNContactStore()
store.requestAccess(for: .contacts) { (granted, error) in
if let error = error {
print("failed to request access", error)
return
}
if granted {
let keys = [CNContactGivenNameKey, CNContactFamilyNameKey, CNContactPhoneNumbersKey]
let request = CNContactFetchRequest(keysToFetch: keys as [CNKeyDescriptor])
do {
try store.enumerateContacts(with: request, usingBlock: { (contact, stopPointer) in
contacts.append(FetchedContact(id: contact.identifier, firstName: contact.givenName, lastName: contact.familyName, telephone: contact.phoneNumbers.first?.value.stringValue ?? ""))
})
} catch let error {
print("Failed to enumerate contact", error)
}
} else {
print("access denied")
}
}
contacts.sort {
$0.firstName < $1.firstName
}
contacts.sort {
$0.lastName < $1.lastName
}
return contacts
}
struct ContactListView: View {
@State var contacts = [FetchedContact]()
var body: some View {
VStack {
Button(action: {
self.contacts = getContacts()
}) {
Text("Update contacts")
}
.padding()
Text("\(self.contacts.count) contacts found")
.padding()
List(self.contacts, id: \.id) { contact in
Text("\(contact.lastName), \(contact.firstName)")
}
.padding(.vertical)
}
.navigationTitle("Contact List View")
}
}
struct ContactListView_Previews: PreviewProvider {
static var previews: some View {
NavigationView() {
ContactListView()
}
}
}