質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

431閲覧

連絡先CNContactPickerViewControllerのチェックが消えません(初期化したいです)。

45tigris

総合スコア14

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2017/11/29 07:16

編集2017/12/05 04:55

<Swift4>で以下のことをしたいです。


①ViewControllerに「取得」ボタンを置き、このボタンを押すとiPhoneの連絡先一覧が開きます。
②一覧から任意の人(複数人)を選んでチェックし「Done」を押すと
アラートが開き、選択した人が表示されます。
③そこからさらに人をタップすると、その人の名前、携帯番号、メールアドレスを表示する。
④人を選んで情報を取得アラートを表示。
⑤4のアラートの「OK」を押すとViewControllerに戻る。
⑥再度、ViewControllerの「取得」ボタンを押してiPhoneの連絡先一覧を開くと
チェックが外れていません。


// ViewController.swift // ToAdressBook // Created by admin on 2017/11/13. // Copyright © 2017年 css. All rights reserved. import UIKit import Contacts import ContactsUI class ViewController: UIViewController, CNContactPickerDelegate, CNContactViewControllerDelegate { @IBOutlet weak var nameField: UITextField! @IBOutlet weak var phoneNumberField: UITextField! @IBOutlet weak var emailAddressField: UITextField! @IBOutlet weak var givenNameField: UITextField! **var target: [(name:String,email:String,phNo:String)] = []** var nameList:[String] = [] let cnPicker = CNContactPickerViewController() //未入力時アラート func minyuryokuAlert() { let alert = UIAlertController( title: "未入力の欄があります", message: "", preferredStyle: .alert) alert.addAction(UIAlertAction(title:"OK", style: .default)) self.present(alert, animated: true, completion: nil) } //「登録」ボタン押下 @IBAction func registerBTPush(_ sender: Any) { //連絡先に追加する可変オブジェクト作成 let newcontact = CNMutableContact() //newcontact.imageData = NSData() as Data //NSDataオブジェクトとしてのプロフィール画像 //キーボードを下げる view.endEditing(true) if nameField.text == "" { self.minyuryokuAlert() } if givenNameField.text == "" { self.minyuryokuAlert() } if phoneNumberField.text == "" { self.minyuryokuAlert() } if emailAddressField.text == "" { self.minyuryokuAlert() } //入力欄が空欄だったらエラーを表示。全て入力されていたら保存 if nameField.text != "" && givenNameField.text != "" && phoneNumberField.text != "" && emailAddressField.text != "" { //名前 let myname = nameField.text! newcontact.givenName = myname //苗字 let myFamilyName = givenNameField.text! newcontact.familyName = myFamilyName //メアド let myemail = emailAddressField.text! as NSString let myEmail = CNLabeledValue(label:CNLabelHome, value:NSString(string: myemail)) newcontact.emailAddresses = [myEmail] //番号 let myphoneNo = phoneNumberField.text! newcontact.phoneNumbers = [CNLabeledValue( label:CNLabelPhoneNumberiPhone, value:CNPhoneNumber(stringValue: myphoneNo))] print("お名前:(newcontact.givenName)") print("苗字:(newcontact.familyName)") print("メアド:(newcontact.emailAddresses)") print("番号:(newcontact.phoneNumbers)") //新しく作成した連絡先を保存 let saveRequest = CNSaveRequest() saveRequest.add(newcontact, toContainerWithIdentifier: nil) do{ //try store.execute(saveRequest) try CNContactStore().execute(saveRequest) print("保存したよ") } catch { print("保存失敗") print(error) } } else { self.minyuryokuAlert() } //初回時に連絡先へのアクセスを許可するかのメッセージを表示する let picker = CNContactPickerViewController() picker.delegate = self self.present(picker, animated: true, completion: nil) } func contactPickerDidCancel(_ picker: CNContactPickerViewController) { print("ContactPickerキャンセルしたよ") } //選んた人をアラートで表示 func displayNameList(mycount:Int){ print("飛んだよ") self.cnPicker.dismiss(animated: false) { print("閉じたよ?") } let alert = UIAlertController( title:"選択した人", message: "", preferredStyle: .alert) //アラートにアクション追加(アクション名は選択した人達) for i in 0..<mycount { alert.addAction( UIAlertAction( title: "(nameList[i])", style: .default, handler: {(action) -> Void in //各アクション(各人の情報をタプル配列から取りアラートで表示) let kekkaAlert = UIAlertController( title: self.target[i].name, message: "(self.target[i].email)" + "\n" + "(self.target[i].phNo)", preferredStyle:.alert) ** kekkaAlert.addAction(UIAlertAction(title: "OK", style: .default)) ** **//このOKを押したらCNContactPickerVeiwのチェックを全て外したい。 **self.present(kekkaAlert, animated: true, completion: nil) print("target name = (self.target[i].name)") print("target email = (self.target[i].email)") print("target phoneNumber = (self.target[i].phNo)") }) ) } //アラートに「キャンセル」追加 alert.addAction( UIAlertAction( title: "Cancel", style: .cancel, handler: nil) ) //アラート表示 self.present( alert, animated: true, completion: { //print("アラート表示したよ") } ) } //「Done」ボタン押下で選択 func contactPicker(_ picker: CNContactPickerViewController, didSelect contacts: [CNContact]){ contacts.forEach { contact in let names = contact.givenName + " " + contact.familyName let emails = (contact.emailAddresses[0].value as! String) let phoneNo = (contact.phoneNumbers[0].value as! CNPhoneNumber).value(forKey: "digits") as! String print("name is = (names)") print("email is = (emails)") print("phoneNo is = (phoneNo)") nameList.append(names) //タプルの配列"target"に入れる target.append((name:names,email:emails,phNo:phoneNo)) print("(target)") } let count = nameList.count print("nameList = (nameList)") displayNameList(mycount:count) } //「一覧」ボタンを押下。連絡先を取得 @IBAction func getMyContact(_ sender: Any) { nameList = [] //連絡先を選択するためにCNContactPickerViewControllerを表示する //これを実行すると初回時に「アプリが連絡先へのアクセスを求めています」というダイアログが表示され、 //連絡先へのアクセス許可が求められる。許可するとiPhoneに登録されている連絡先リストが表示される。 //let cnPicker = CNContactPickerViewController() cnPicker.delegate = self self.present(cnPicker, animated: true, completion: nil) } //名前入力欄を消去 @IBAction func NameFieldDelete(_ sender: Any) { nameField.text = "" } @IBAction func givenNameDelete(_ sender: Any) { givenNameField.text = "" } //電話番号入力欄を消去 @IBAction func phoneNumFieldDelete(_ sender: Any) { phoneNumberField.text = "" } func addAddressSave(){ } //emailアドレス入力欄を消去 @IBAction func emailFieldDelete(_ sender: Any) { emailAddressField.text = "" } override func viewDidLoad() { super.viewDidLoad() } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } ////キーボードに閉じるボタンをつける func makeKeyboard(){ //仮のサイズでツールバー作成 let kbToolBar = UIToolbar(frame: CGRect(x: 0,y: 0, width: 320, height: 40)) kbToolBar.barStyle = UIBarStyle.default //スタイル設定 kbToolBar.sizeToFit() //画面に合わせてサイズ調整 //スペーサー let spacer = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.fixedSpace, target: self, action: nil) //閉じるボタン let commitButton = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.done, target: self, action: #selector(ViewController.commitButtonTapped)) kbToolBar.items = [spacer, commitButton] nameField.inputAccessoryView = kbToolBar phoneNumberField.inputAccessoryView = kbToolBar emailAddressField.inputAccessoryView = kbToolBar givenNameField.inputAccessoryView = kbToolBar } @objc func commitButtonTapped(){ self.view.endEditing(true) } }

1
2
3
4

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

func displayNameList(mycount:Int){}で毎回let cnPicker = CNContactPickerViewController()
することで解決できました。

投稿2017/12/18 06:01

45tigris

総合スコア14

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問