自分のアプリの初期化または、CNContactPickerViewControllerのチェックの外し方
Swift 4 でアプリを作成しています。
①ViewControllerに「取得」ボタンを置き、このボタンを押すとiPhoneの連絡先一覧が開きます。
②一覧から任意の人(複数人)を選んでチェックし「Done」を押すとアラートが開き、選択した人が表示されます。
③そこからさらに人をタップすると、その人の名前、携帯番号、メールアドレスを表示されます。
④③のアラートの「OK」を押すとViewControllerに戻る。
⑤再度、ViewControllerの「取得」ボタンを押してiPhoneの連絡先一覧を開くと チェックが外れていません。
「④」の段階で「②」でチェックされたCNContactPickerViewControllerをUncheckしたいです。もしくは、ここでアプリを初期化したらチェックが消えるのではと思っていますが分かりません。
// 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 {
var target: [(name:String,email:String,phNo:String)] = []
var nameList:[String] = []
var cnPicker = CNContactPickerViewController()
func contactPickerDidCancel(_ picker: CNContactPickerViewController) {
print("ContactPickerキャンセルしたよ")
}
//アプリを初期化???
func applicationWillEnterForeground(application:UIApplication){
let storyboard = UIStoryboard(name: "Main", bundle: nil)
storyboard.instantiateViewController(withIdentifier: "MainViewController")
}
//選んた人をアラートで表示
func displayNameList(mycount:Int){
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,
handler: {(action) -> Void in
//チェックを消す処理またはアプリを初期化したい
//ここで処理?
//targetを初期化
self.target = []
}))
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("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)
}
override func viewDidLoad() {
super.viewDidLoad()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
@objc func commitButtonTapped(){
self.view.endEditing(true)
}
}
画面1
画面2
画面3
画面4
画面5