Swift 3中创建多手机号联系人失败,求助解决方法
解决Swift添加多个手机号到联系人的问题
我来帮你排查这个问题!你的代码逻辑大方向是对的,但可能有几个细节没注意到,导致多个手机号没有正确显示或保存。咱们一步步来调整:
首先,先确认你的myContact.getPhones()返回的数组确实包含多个有效的手机号——有时候数据源本身的问题会让人误以为是代码逻辑出错。接下来,我们可以优化代码的健壮性,确保每个手机号都能被正确添加:
修改后的完整代码
private func createNewContact(myContact: AgregarContactoViewModel) { let store = CNContactStore() let contact = CNMutableContact() // 设置联系人姓名 contact.familyName = myContact.getName() // 遍历添加所有手机号 for phoneStr in myContact.getPhones() { // 先验证手机号格式是否合法,避免无效号码干扰 guard let phoneNumber = CNPhoneNumber(stringValue: phoneStr) else { print("跳过无效手机号:\(phoneStr)") continue } // 给每个手机号创建独立的CNLabeledValue对象 let labeledPhone = CNLabeledValue(label: CNLabelOther, value: phoneNumber) contact.phoneNumbers.append(labeledPhone) } // 调试用:打印已添加的手机号数量,确认是否全部加入 print("已成功添加\(contact.phoneNumbers.count)个手机号") // 初始化联系人编辑控制器 let controller = CNContactViewController(forNewContact: contact) controller.contactStore = store controller.delegate = self controller.allowsEditing = true // 明确允许编辑,确保所有号码都能展示 // 跳转界面 navigationController?.setNavigationBarHidden(false, animated: true) navigationController?.pushViewController(controller, animated: true) }
关键优化点说明
- 格式校验:用
guard let过滤掉格式无效的手机号,避免单个无效号码导致整个添加流程出问题 - 调试输出:添加打印语句可以快速确认数组里的手机号是否都被成功加入到
contact.phoneNumbers中 - 明确编辑权限:虽然
CNContactViewController默认允许编辑,但显式设置allowsEditing = true能确保界面正确加载所有预先添加的信息
额外注意事项
- 联系人权限:确保你已经在
Info.plist中添加了NSContactsUsageDescription字段,并在调用创建方法前请求了联系人访问权限,否则可能会导致保存失败。权限请求的示例代码:
private func requestContactsPermission(completion: @escaping (Bool) -> Void) { let store = CNContactStore() store.requestAccess(for: .contacts) { granted, error in DispatchQueue.main.async { completion(granted) } } } // 调用方式 requestContactsPermission { [weak self] granted in if granted { self?.createNewContact(myContact: yourContactModel) } else { print("需要授予联系人权限才能创建联系人") } }
- 标签区分:如果希望在联系人界面区分不同的手机号,可以把
CNLabelOther换成系统提供的标签(比如CNLabelHome、CNLabelWork),或者自定义标签(比如"紧急联系人"),示例:
// 使用自定义标签 let labeledPhone = CNLabeledValue(label: "紧急联系人", value: phoneNumber)
如果调整后还是只能添加一个手机号,建议先打印myContact.getPhones()的内容,确认数据源确实包含多个非空的手机号。
内容的提问来源于stack exchange,提问作者Faustino Gagneten
相关产品推荐
相关产品推荐

