Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用SwiftUI在iOS上获取和显示联系人照片?_Swiftui - Fatal编程技术网

如何使用SwiftUI在iOS上获取和显示联系人照片?

如何使用SwiftUI在iOS上获取和显示联系人照片?,swiftui,Swiftui,我有一个运行脚本,可以在iOS上用SwiftUI读取和显示所有联系人,但我也很难显示联系人图像。调试代码时,所有联系人的imageData都似乎为空,而hasImageData为false。一般来说,联系人是从谷歌同步到iPhone的,但出于测试目的,我在iPhone上添加了一些照片到一些联系人,结果相同——没有结果 希望任何人都知道出了什么问题:-) 导入快捷界面 导入联系人 结构FetchedContact{ 变量id:String var firstName:String var las

我有一个运行脚本,可以在iOS上用SwiftUI读取和显示所有联系人,但我也很难显示联系人图像。调试代码时,所有联系人的imageData都似乎为空,而hasImageData为false。一般来说,联系人是从谷歌同步到iPhone的,但出于测试目的,我在iPhone上添加了一些照片到一些联系人,结果相同——没有结果

希望任何人都知道出了什么问题:-)


导入快捷界面
导入联系人
结构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()
}
}
}
解决方案:

  • 向查询中添加所需的键

    let keys=[CNContactGivenNameKey、CNContactFamilyNameKey、CNContactPhoneNumbersKey、CNContactImageDataKey、CNContactImageDataAvailableKey、CNContactThumbnailImageDataKey]

  • 修改图像显示

    Image(uiImage:uiImage(数据:contact.Image??data())??uiImage())


  • 这是否回答了您的问题?是的,事实上我没有向请求中添加相应的键-谢谢:-)
    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()
            }
        }
    }