gpt4 book ai didi

ios - 添加联系人时重新加载 TableView swift

转载 作者:行者123 更新时间:2023-11-29 05:18:51 26 4
gpt4 key购买 nike

我使用ContactUI FrameWork来获取、编辑、创建新的Conatacts。 VC1 中有一个 TableView 用于显示联系人,还有另一个 View Controller 用于编辑或创建新联系人。问题是在 VC 2 中编辑或创建联系人时,VC1 中的 TableView 不会更新。

型号:

class ContactStruct : NSObject {
let identifier : String
let thumbnailImageData : UIImage?
let givenName : String
let familyName : String
let phoneNumbers : String
let emailAddresses : String

init(identi:String,img:UIImage?,name:String,family:String,phone:String,email:String) {
self.identifier = identi
self.thumbnailImageData = img
self.givenName = name
self.familyName = family
self.phoneNumbers = phone
self.emailAddresses = email
}
class func generateModelArray() -> [ContactStruct]{
let contactStore = CNContactStore()
var contactsData = [ContactStruct]()

let key = [CNContactGivenNameKey,CNContactFamilyNameKey,CNContactImageDataKey,CNContactThumbnailImageDataKey,CNContactPhoneNumbersKey,CNContactEmailAddressesKey,CNLabelPhoneNumberMobile] as [CNKeyDescriptor]
let request = CNContactFetchRequest(keysToFetch: key)
try? contactStore.enumerateContacts(with: request, usingBlock: { (contact, stoppingPointer) in
let givenName = contact.givenName
let familyName = contact.familyName
let emailAddress = contact.emailAddresses.first?.value ?? ""
let phoneNumber = contact.phoneNumbers.first?.value.stringValue ?? ""
let identifier = contact.identifier
var image : UIImage?
if contact.thumbnailImageData != nil{
image = UIImage(data: contact.thumbnailImageData!)!
}
contactsData.append(ContactStruct(identi: identifier, img: image, name: givenName, family: familyName, phone: phoneNumber, email: emailAddress as String))
})
return contactsData
}
}

i reload table view in VC1 in many ways but it doesnt work . when i run again the app table view show the change fine .

VC1中重新加载 TableView 的方法:

VC2 中的委托(delegate):

    protocol InsertContactViewControllerDelegate {
func applyingFor_reloadTableView()
}

class InsertContactViewController: UIViewController {

var delegate : InsertContactViewControllerDelegate?

override func viewDidLoad() {
super.viewDidLoad()
}
@IBAction func btnUpdate_DidTouch(_ sender: Any) {
if let delegate = self.delegate {
delegate.applyingFor_reloadTableView()
}
modifyContact(contactIdentifier: stridentifier)
self.navigationController?.popViewController(animated: true)
}

在 vc1 中:

 class NewContactViewController:UIViewController, 

BackGroundViewControllerDelegate {
@IBOutlet weak var tblMain: UITableView!

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let story = UIStoryboard(name: "Main", bundle: nil)
let vc = story.instantiateViewController(withIdentifier: "InsertContactViewController") as! InsertContactViewController
vc.delegate = self
self.navigationController?.pushViewController(vc, animated: true)
}

func applyingFor_reloadTableView() {
self.tblMain.reloadData()
}

}

修改联系方式,我将联系标识符传递给 VC2 进行更新:

   func modifyContact(contactIdentifier:String) {
let key = [CNContactGivenNameKey,CNContactFamilyNameKey,CNContactImageDataKey,CNContactThumbnailImageDataKey,CNContactEmailAddressesKey,CNContactPhoneNumbersKey] as [CNKeyDescriptor]
let contact = try? contactStore.unifiedContact(withIdentifier: contactIdentifier, keysToFetch: key)

let mutableContact = contact?.mutableCopy() as! CNMutableContact
let indexpath0 = IndexPath(row: 0, section: 0)
let cell = tblInsert.cellForRow(at: indexpath0) as! InsertTableCell0
let name = cell.txtFirstName.text
let family = cell.txtLastName.text
mutableContact.givenName = name!
mutableContact.familyName = family!
let indexpath1 = IndexPath(row: 0, section: 1)
let cell1 = tblInsert.cellForRow(at: indexpath1) as! InsertTableCell1
let phone : String = cell1.txtPhoneNumber.text!
mutableContact.phoneNumbers = [CNLabeledValue(label: CNLabelPhoneNumberMobile, value:CNPhoneNumber(stringValue: phone))]
let indexpath2 = IndexPath(row: 0, section: 2)
let cell2 = tblInsert.cellForRow(at: indexpath2) as! InsertTableCell2
let email : String = cell2.txtEmail.text!
mutableContact.emailAddresses = [CNLabeledValue(label: CNLabelHome, value: email as NSString)]
let saveRequest = CNSaveRequest()
saveRequest.update(mutableContact)
try! contactStore.execute(saveRequest)
}

最佳答案

您正在更新联系人之前重新加载 VC1 tableView。首先更新联系人并重新加载 tableView

代码:

 @IBAction func btnUpdate_DidTouch(_ sender: Any) {

modifyContact(contactIdentifier: stridentifier)
if let delegate = self.delegate {
delegate.applyingFor_reloadTableView()
}
self.navigationController?.popViewController(animated: true)
}


func applyingFor_reloadTableView() {
tableViewDataSource = ContactStruct.generateModelArray() // used your dataSource variable instead of tableViewDataSource.
self.tblMain.reloadData()
}

关于ios - 添加联系人时重新加载 TableView swift,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58888609/

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