【问题标题】:How to add new email to CNMutableContact in Swift 3?如何在 Swift 3 中向 CNMutableContact 添加新电子邮件?
【发布时间】:2016-09-22 21:03:24
【问题描述】:

很快..我有这个代码来添加新联系人,它一直在工作,直到将我的代码转换为 Swift 3,现在它接受除了电子邮件之外的所有属性我收到两个错误:

1-参数类型“字符串?”不符合预期类型 'NSCopying'

2-参数类型“字符串?”不符合预期类型 'NSSecureCoding'

这是我尝试向联系人添加电子邮件时的代码:

    let workEmail = CNLabeledValue(label:"Work Email", value:emp.getEmail())
    contact.emailAddresses = [workEmail]

有什么帮助吗?

【问题讨论】:

    标签: ios swift cncontact


    【解决方案1】:

    在 Swift 3 中,CNLabeledValue 被声明为:

    public class CNLabeledValue<ValueType : NSCopying, NSSecureCoding> : NSObject, NSCopying, NSSecureCoding {
        //...
    }
    

    你需要让 Swift 能够推断出ValueType,它符合NSCopyingNSSecureCoding

    很遗憾,StringString? 都不符合它们。

    而且,Swift 3 移除了一些隐式类型转换,例如 StringNSString,您需要显式转换。

    请试试这个:

    let workEmail = CNLabeledValue(label:"Work Email", value:(emp.getEmail() ?? "") as NSString)
    contact.emailAddresses = [workEmail]
    

    或者这个:

    if let email = emp.getEmail() {
        let workEmail = CNLabeledValue(label:"Work Email", value:email as NSString)
        contact.emailAddresses = [workEmail]
    }
    

    (也许后者更好,你不应该做空条目。)

    另外,正如 Cesare 所建议的,您最好尽可能使用预定义的常量,例如 CNLabel... 作为标签:

    if let email = emp.getEmail() {
        let workEmail = CNLabeledValue(label: CNLabelWork, value: email as NSString)
        contact.emailAddresses = [workEmail]
    }
    

    【讨论】:

    • 最好使用CNLabelWork 而不是“工作电子邮件”,因为前者已本地化为每种语言
    • @Cesare,谢谢。不错的建议。我会在我的回答中接受它。
    【解决方案2】:

    Swift 3:电子邮件和电话输入

    文档https://developer.apple.com/reference/contacts

    let workPhoneEntry : String = "(408) 555-0126"
    let workEmailEntry : String = "test@apple.com"
    let workEmail = CNLabeledValue(label:CNLabelWork, value:workEmailEntry as NSString)
        contact.emailAddresses = [workEmail]
    
        contact.phoneNumbers = [CNLabeledValue(
            label:CNLabelPhoneNumberMain,
            value:CNPhoneNumber(stringValue:workPhoneEntry))]
    

    【讨论】:

      【解决方案3】:
       let workemail = "" //Your Input goes here
       let WorkEmail = CNLabeledValue(label:CNLabelWork, value: workmail as NSString)
       contact.emailAddresses = [WorkEmail]
      

      对于 Swift 3

      【讨论】:

      • 在workemail中添加输入值并将WorkEmail添加到contact.emailAddresses中
      【解决方案4】:

      对于 Swift 3 和 ios >= 9.0

      你可以使用方法 CNContact mutableCopy

      func saveVCardContacts (vCard : Data) {
          if #available(iOS 9.0, *) {
              let contactStore = CNContactStore()
              do {
                  let saveRequest = CNSaveRequest() 
                  let contacts = try CNContactVCardSerialization.contacts(with: vCard)
                  var mutablePerson: CNMutableContact
                  for person in contacts{
                      mutablePerson = person.mutableCopy() as! CNMutableContact
                      saveRequest.add(mutablePerson, toContainerWithIdentifier: nil)
                  }
                  try contactStore.execute(saveRequest)
              } catch  {
                  print("Unable to show the new contact")
              }
          }else{
              print("CNContact not supported.")
          }
      }
      

      【讨论】:

      • 这没有回答问题。 OP 的代码创建了一个CNLabeledValue,他在那里遇到了问题。您的示例没有以任何方式解决此问题。
      猜你喜欢
      • 1970-01-01
      • 2012-06-06
      • 1970-01-01
      • 2018-08-14
      • 2017-10-08
      • 1970-01-01
      • 2014-11-13
      • 1970-01-01
      • 2011-08-04
      相关资源
      最近更新 更多