2017-03-06 19 views
0

タイトルに示されているように、swiftを使用している私のiOSアプリケーションでは、CNContactPropertyオブジェクトがあり、その文字列として電話番号を抽出します。iOS Swift:CNContactPropertyから選択した電話番号を文字列として取得します。

CNContactプロパティは、ユーザーが連絡先を選択すると、標準のCNContactPickerViewControllerからデリゲートプロトコル関数を介して返されます。

連絡先に複数の電話番号がある場合、連絡先ビューでCNContactPropertyからタップした電話番号を抽出できます。

私はこのような何かをしようとしている:

let myString = theCNContactProperty.value as! String 

しかし、これは(lldb)エラーでクラッシュします。私はおそらく "価値"のプロパティは私が必要なものではないと思う?私はそうのような任意の番号を取得することができるよ

let myString = contactProperty.contact.phoneNumbers[0].value.stringValue 

接触が持っている最初の数を返します。しかし、連絡先に1つ以上の番号がある場合、ユーザーが選択した特定の番号を抽出できるようにするために、これは私の目的には役立ちません。

私はこれを数時間にわたってやってきましたが、それを理解することができませんでした。

編集:これは、提供されたリンクの複製ではありません。リンクされた質問は、連絡先からすべての番号を取得することであり、特に選択されたものではありません。それには大きな違いがあります。

+0

'theCNContactProperty.value'の種類は何ですか? – dan

+0

"any"タイプの値です。私はそのデータが何を表しているのかも分かりませんが、 "価値"はそれが私が探しているものかもしれないことを示唆しています。 しかし、そういう文字列としてキャストしようとするとクラッシュします: let test = contactProperty.value as! String – b1skit

+0

2番目の例はこれを行う唯一の方法ですので、選択した番号のインデックスを取得する方法を考え出す必要があります。 – Timmy

答えて

0

あなたがこれを使用することができます - 連絡先が複数の電話番号を持っている場合、これは最初のものだけを取得しますが...

var thePhoneLabel: String? 
var thePhoneNumber: String? 

func contactPicker(picker: CNContactPickerViewController, didSelectContact contact: CNContact) { 

    picker.dismissViewControllerAnimated(true, completion: { 

     if contact.phoneNumbers.count > 0 { 

      if let anEntry = contact.phoneNumbers.first { 
       if let theNumber = anEntry.value as? CNPhoneNumber { 

        // Get the label for the phone number (Home, Work, Mobile, etc) 
        self.thePhoneLabel = CNLabeledValue.localizedStringForLabel(anEntry.label) 

        // Get the actual phone number (as a string) 
        self.thePhoneNumber = theNumber.stringValue 

       } 
      } 

     } else { 
      // contact has no phone numbers 
      self.thePhoneLabel = "(No Phone)" 
      self.thePhoneNumber = "(No Phone)" 
     } 

    }) 

} 

EDIT:

使用している場合:

その後、
contactPickerViewController.displayedPropertyKeys = [CNContactPhoneNumbersKey] 

var theContactName: String? 
var thePhoneNumber: String? 
var thePhoneLabel: String? 

func contactPicker(picker: CNContactPickerViewController, didSelectContactProperty contactProperty: CNContactProperty) { 

    theContactName = contactProperty.contact.givenName 
    thePhoneNumber = contactProperty.value?.stringValue 

    if let lbl = contactProperty.label { 
     thePhoneLabel = CNLabeledValue.localizedStringForLabel(lbl) 
    } 

} 

注:

FUNCのcontactPicker(_ピッカー:CNContactPickerViewController、didSelect contactProperty:CNContactProperty)あなたは

FUNCのcontactPicker(_を持っていない場合は

機能のみが呼び出されますピッカー:CNContactPickerViewController、didSelect コンタクト:CNContact)

+0

こんにちは、ありがとう。私はすでに最初の番号を取得する方法を考え出しています: theNumber = contactProperty.contact.phoneNumbers [0] .value.stringValue let 残念ながら、ユーザーが選択した特定の番号を取得できる必要があります。連絡先の最初の番号のみ。 – b1skit

+0

ユーザーが特定の電話番号を選択できるようにするために使用している機能は何ですか? – DonMag

+0

CNContactPickerViewControllerをユーザーに表示し、そのクラスにCNContactPickerDelegateプロトコル関数を実装して戻り値をキャッチします。それは私にCNContactPropertyを与える – b1skit

0

あなたは、あなたがCNContactViewControllerから選択した電話番号を取得できるようにしたいと言いました。

CNContactViewControllerには、ユーザーが選択したキーを返す代理関数があります。これは、関数である:

その関数で
optional func contactViewController(_ viewController: CNContactViewController, 
    shouldPerformDefaultActionFor property: CNContactProperty) -> Bool 

、あなたがこれを行うことにより、選択された電話番号を取得することができます:あなたは、この機能にfalseを返す場合

let myString = property.identifier 

また、アクションは文句を言わないその場所を取ります私はそれが自動的に番号を呼び出すことはないと思う。

+0

私はこれを動作させることはできません。 CNContactViewControllerDelegateインターフェイスをクラスに追加して、前述の関数を実装しようとしましたが、CNContactPickerViewControllerによってトリガーされません。 CNContactPickerViewControllerは、CNContactPickerDelegateの関数のみを起動するようですか? – b1skit

+0

元の投稿をこのコードで更新して、実装方法を確認できますか?また、重複した投稿レポートと戦うこともできます。これは重複した投稿ではありません! – Timmy

+0

@Timmy - 'didSelectContactProperty'を実装するための私の答えを見てください – DonMag

関連する問題