这个函数是在我的"viewDidLoad(("中调用的。我能够成功检索所有联系人,尽管数据不会显示,直到我单击另一个选项卡栏项目,然后返回到表视图选项卡栏项目。这是我的密码。。
func getContacts()
{
print("Attempting to fetch Contacts")
let store = CNContactStore()
store.requestAccess(for: .contacts) { (granted, err) in
if let err = err {
print("failed to request Access", err)
return
}
if granted {
print("access granted")
let keys = [CNContactGivenNameKey, CNContactFamilyNameKey, CNContactPhoneNumbersKey]
let request = CNContactFetchRequest(keysToFetch: keys as [CNKeyDescriptor])
request.sortOrder = CNContactSortOrder.userDefault
do {
var contactNames = [ContactNames]()
try store.enumerateContacts(with: request, usingBlock: {(contact, stopPointerIfYouWantToStopEnumerating) in
contactNames.append(ContactNames(contact: contact))
})
self.contactsArray = contactNames
}catch let err {
print("Failed to enumerate contacts", err)
}
} else{
print("access denied")
}
}
}
在第一次填充表视图时,您的数据不会被加载。当您使用选项卡导航时,它会起作用,因为数据已在返回到表视图选项卡时加载,这会强制重新加载表视图。
假设您的表视图数据源使用self.contactsArray
,您只需要在将数据分配给self.contactsArray
后调用tableview.reloadData()
。
一定要在主线程上执行此操作。
self.contactArray = contactNames
DispatchQueue.main.async {
self.tableView.reloadData()
}