请原谅我缺乏知识,我正在尝试制作我的第一个 iOS 应用程序,我的目标是将我的所有联系人导入 swiftui 视图:
//ContentView.swift
import SwiftUI
struct ContentView: View {
var contact = contactData
@ObservedObject var contacts = ContactList()
var body: some View {
NavigationView {
List {
ForEach(contact) { item in
VStack(alignment: .leading) {
HStack {
Text(item.contactName)
}
}
}
.onDelete { index in
self.contacts.contact.remove(at: index.first!)
}
}
.navigationBarTitle(Text("Contacts"))
.navigationBarItems(
trailing: EditButton()
)
}
}
}
#if DEBUG
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
#endif
struct Contacts: Identifiable {
var id = UUID()
var contactName: String
}
let contactData = [
Contacts(contactName: "Foo Bar"),
Contacts(contactName: "Johnny Appleseed")
]
和
//ContactList.swift
import Combine
class ContactList: ObservableObject {
@Published var contact: [Contacts] = contactData
}
使用Combine API 和.onDelete
函数,我想删除多个联系人(目前不是iOS 中的功能),然后将它们返回到联系人应用程序中。
我在拉入联系人列表时被卡住了,我已经尝试了多种不同的使用 Swift 执行此操作的方法,例如:在 iOS Swift 中获取所有联系人?
var contacts = [CNContact]()
let keys = [CNContactFormatter.descriptorForRequiredKeysForStyle(.FullName)]
let request = CNContactFetchRequest(keysToFetch: keys)
do {
try self.contactStore.enumerateContactsWithFetchRequest(request) {
(contact, stop) in
// Array containing all unified contacts from everywhere
contacts.append(contact)
}
}
catch {
print("unable to fetch contacts")
}
但这似乎并没有在不抛出一堆错误的情况下正常工作。我目前并不担心删除,但更主要的是专注于导入联系人。
有谁知道是否有使用 SwiftUI 和 Contacts API 来做到这一点的好方法?或者至少可以指出我正确的方向?我知道我使用的是 Xcode 11 Beta 5,这可能会导致弃用不同 API 的问题,但 Xcode 11 中的 Contact API 似乎相对没有变化。
您通常ObservableObject
用于模型/控制器交互。发布它们只是让我将结果分配给变量。
它目前在onAppear
async内部启动提取,否则它会阻止 UI 加载并且请求联系人将不起作用。
缺少的是更好的授权处理(请参阅此)、删除/创建、刷新(在其他地方调用 fetch)和更全面的功能。
一个有条件的可以让我展现接触或错误,这使得迅速查明错误。
注意:您必须将隐私联系人描述添加到您的info.plist中,以免崩溃。否则它应该可以在不更改任何其他内容的情况下工作。
注 2:由于SwiftUI只有接线和UI像@dfd 所说的那样发生了变化。如何检索联系人仍然完全相同。
import Contacts
import SwiftUI
import os
class ContactStore: ObservableObject {
@Published var contacts: [CNContact] = []
@Published var error: Error? = nil
func fetch() {
os_log("Fetching contacts")
do {
let store = CNContactStore()
let keysToFetch = [CNContactGivenNameKey as CNKeyDescriptor,
CNContactMiddleNameKey as CNKeyDescriptor,
CNContactFamilyNameKey as CNKeyDescriptor,
CNContactImageDataAvailableKey as CNKeyDescriptor,
CNContactImageDataKey as CNKeyDescriptor]
os_log("Fetching contacts: now")
let containerId = store.defaultContainerIdentifier()
let predicate = CNContact.predicateForContactsInContainer(withIdentifier: containerId)
let contacts = try store.unifiedContacts(matching: predicate, keysToFetch: keysToFetch)
os_log("Fetching contacts: succesfull with count = %d", contacts.count)
self.contacts = contacts
} catch {
os_log("Fetching contacts: failed with %@", error.localizedDescription)
self.error = error
}
}
}
extension CNContact: Identifiable {
var name: String {
return [givenName, middleName, familyName].filter{ $0.count > 0}.joined(separator: " ")
}
}
struct ContactsView: View {
@EnvironmentObject var store: ContactStore
var body: some View {
VStack{
Text("Contacts")
if store.error == nil {
List(store.contacts) { (contact: CNContact) in
return Text(contact.name)
}.onAppear{
DispatchQueue.main.async {
self.store.fetch()
}
}
} else {
Text("error: \(store.error!.localizedDescription)")
}
}
}
}
struct ContactsViewOrError: View {
var body: some View {
ContactsView().environmentObject(ContactStore())
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句