-3

Es wird versucht, die Telefonnummer aus CNContacts abzurufen. Ich rufe einen Contact-Picker-View-Controller auf, und wenn der Benutzer mehrere Kontakte auswählt, erstelle ich eine Nachricht, die View-Controller erstellt. Ich muss ein Array von Strings erstellen, die weitergeleitet werden, wenn die Empfänger der Nachricht den View-Controller erstellen. Fehler kommt aus der folgenden Zeile ... contactsPhoneNumber.append(phoneNumber)Der Typ '[String: Any Object]' kann nicht in den erwarteten Typ 'String' konvertiert werden.

func AddFriendTapped() { 
    let contactPickerViewController = CNContactPickerViewController() 
    contactPickerViewController.delegate = self 
    presentViewController(contactPickerViewController, animated: true, completion: nil) 
} 


func contactPicker(picker: CNContactPickerViewController,didSelectContacts contacts: [CNContact]) { 

    //check if phone can send texts, if so, continue 
    if !MFMessageComposeViewController.canSendText(){ 

     let composeVC = MFMessageComposeViewController() 
     composeVC.messageComposeDelegate = self 

     //must get phone number strings from CNContact 
     let phoneNumberKey = [CNContactPhoneNumbersKey] 
     for contact in contacts { 
      var phoneNumber = contact.dictionaryWithValuesForKeys(phoneNumberKey) 
      contactsPhoneNumber.append(phoneNumber) 
     } 

     composeVC.recipients = contactsPhoneNumber 
     composeVC.body = "Hi, test message" 

     // Present the view controller modally. 
     dismissViewControllerAnimated(true) { 
      self.presentViewController(composeVC, animated: true, completion: nil) 
     } 

    } 

} 

func messageComposeViewController(controller: MFMessageComposeViewController, 
            didFinishWithResult result: MessageComposeResult) { 
    // Check the result or perform other tasks. 

    // Dismiss the mail compose view controller. 
    controller.dismissViewControllerAnimated(true, completion: nil) 
} 
+0

In welcher Zeile tritt der Compilerfehler auf? – luk2302

+0

'var phoneNumbers = contact.phoneNumbers', kein 'dictionaryWithValuesForKeys'. Das sollte dir auch zeigen, dass 'phoneNumbers' ein Array ist – Sulthan

+0

Die Fehlermeldung besagt, dass der Wert, der' phoneNumber' zugewiesen wird, ein Wörterbuch ist (welches *** Wörterbuch ** WithValuesForKeys * impliziert) und nicht die erwartete Zeichenkette – vadian

Antwort

2

Ein Kontakt mehrere Telefonnummern können so contact.phoneNumbers eine Reihe von CNlabeledValue zurückgibt. Sie benötigen zwei Schleifen, eine zum Iterieren aller anderen Kontakte, um alle Zahlen zu iterieren. Dann müssen Sie die Telefonnummer vom Typ CNPhoneNumber extrahieren und dann in eine Zeichenfolge umwandeln.

Ich habe einige Änderungen in Ihrem Code vorgenommen. Ich hoffe es hilft. :)

func contactPicker(picker: CNContactPickerViewController,didSelectContacts contacts: [CNContact]) { 

    //check if phone can send texts, if so, continue 
    if !MFMessageComposeViewController.canSendText(){ 

     let composeVC = MFMessageComposeViewController() 
     composeVC.messageComposeDelegate = self 

     //must get phone number strings from CNContact 

     //let phoneNumberKey = [CNContactPhoneNumbersKey] 


     for contact in contacts { 
      let contactNumberArray = contact.phoneNumbers 
      for contactNumber in contactNumberArray{ 
       let number = contactNumber.value as! CNPhoneNumber 
       contactsPhoneNumber.append(number.stringValue) 
      } 
     } 


     composeVC.recipients = contactsPhoneNumber 
     composeVC.body = "Hi, test message" 

     // Present the view controller modally. 
     dismissViewControllerAnimated(true) { 
      self.presentViewController(composeVC, animated: true, completion: nil) 
     } 

    } 

} 
+0

Wort mayne, ich habe es auch herausgefunden, Requisiten auf die Antwort! – cnichs27