2016-10-25 15 views
0

CNContactPickerViewControllerに番号が関連付けられていない連絡先を選択すると、この代理メソッドは呼び出されません。contactPickerDid CNContactPickerDelegateのキャンセルが一度も呼び出されていない

/*! 
* @abstract Invoked when the picker is closed. 
* @discussion The picker will be dismissed automatically after a contact or property is picked. 
*/ 
optional public func contactPickerDidCancel(picker: CNContactPickerViewController) 

番号を持つ連絡先を選択すると、それが呼び出されます。しかし、メソッドのドキュメンテーションから、何があっても呼び出されるべきだと思われます。

私の問題は、ユーザーが番号のない連絡先を選択した場合、UIAlertControllerを提示する必要があることです。しかし、私はCNContactPickerViewControllerが却下された後にしかこれを行うことができません。

viewDidAppearでいくつかのロジックを使用すると本当にハッキーになるかもしれませんが、よりクリーンな方法が必要です。

ザ・唯一残っているデリゲートメソッドは、次のとおりです。CNContactPickerViewControllerは、実際に画面を去ったときに決定するのに役立ちません

/*! 
* @abstract Singular delegate methods. 
* @discussion These delegate methods will be invoked when the user selects a single contact or property. 
*/ 
optional public func contactPicker(picker: CNContactPickerViewController, didSelectContact contact: CNContact) 
optional public func contactPicker(picker: CNContactPickerViewController, didSelectContactProperty contactProperty: CNContactProperty) 

/*! 
* @abstract Plural delegate methods. 
* @discussion These delegate methods will be invoked when the user is done selecting multiple contacts or properties. 
* Implementing one of these methods will configure the picker for multi-selection. 
*/ 
optional public func contactPicker(picker: CNContactPickerViewController, didSelectContacts contacts: [CNContact]) 
optional public func contactPicker(picker: CNContactPickerViewController, didSelectContactProperties contactProperties: [CNContactProperty]) 

(Xcode8/swift2.3/iOS10)

+0

連絡先を選択すると、なぜ「contactPickerDidCancel」が呼び出されるのですか? – Adeel

+0

@Adeel大きな質問、わからないがそれです。連絡先に関連付けられた番号がある場合に限ります。 – random

答えて

2

次のような警告をポップアップ表示することができます。 「もう一度やり直す」ボタンを追加して、ピッカーを再起動することもできます。

func contactPicker(_ picker: CNContactPickerViewController, didSelect contact: CNContact) { 
     let name = CNContactFormatter.string(from: contact, style: .fullName) 
     let phones = contact.phoneNumbers 
     if phones.count == 0 { 
      let alertController = UIAlertController(title: "Error", message: "\(name) has no phone numbers", preferredStyle: .alert) 
      alertController.addAction(UIAlertAction(title: "Ok", style: .default) { (action) in }) 
      picker.dismiss(animated: false){ 
       self.present(alertController, animated: true) {} 
      } 
     } 
     //Do stuff here 
    } 
+0

これは私が今持っているものですが、警告が表示されていません。この代理メソッドは、連絡先選択ツールが既にモーダルで表示されているときに呼び出されるためです。 – random

+0

コードを見ると、picker.dimissの完了ハンドラで呼び出されるので、ピッカーが画面外になった後に発生します。そうでなければ、別のVCがあるときにモーダルを表示しようとするとエラーがログに記録されます。モーダルで表示されます。これは私が実行しているプロダクションコードのバージョンです(実際にはアクションシートとして電子メールを表示しますので、概念的には同じものですが、私のプログラムで上のコードにドロップして動作します) 。 –

+0

ああ!あなたが正しい。私は 'picker.dismiss'行を見ませんでした。今動作している 'picker.dismissViewControllerAnimated'を使用しなければなりませんでした。あなた自身がそれを却下したときにそれをプログラムで呼び出す必要があるのは不思議そうです。 – random

関連する問題