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

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

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

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

Q&A

解決済

1回答

1808閲覧

Swift4 ViewControllerで入力したものを連絡先に追加したいです。

45tigris

総合スコア14

Swift

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

0グッド

0クリップ

投稿2017/11/22 07:17

Swift4 ViewControllerで入力したものを連絡先に追加したいです。

プログラミング初心者で伝わりにくかったら、すみません。
ViewControllerに「名前・メールアドレス・携帯番号」TextField入力画面があり、
「登録」ボタンを押すと、入力した情報がiPhoneの連絡先に追加される。
ということがしたいのですが、チンプンカンプンです。
メチャクチャかもしれないですが、以下のように書いてみましたがダメでした。
教えてください。よろしくお願いします。

// // ViewController.swift // ToAdressBook // // Created by admin on 2017/11/13. // Copyright © 2017年 css. All rights reserved. // import UIKit import Contacts import ContactsUI //連絡先に追加する可変オブジェクトを追加する //var contact = CNMutableContact() 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! //未入力時アラート 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("名前:(myname)") print("苗字:(myFamilyName)") print("e-mail:(myemail)") print("e-Eail:(myEmail.value)") print("番号:(myphoneNo)") print("******************************") print("お名前:(newcontact.givenName)") print("苗字:(newcontact.familyName)") print("メアド:(newcontact.emailAddresses)") print("番号:(newcontact.phoneNumbers)") //新しく作成した連絡先を保存 //let store = CNContactStore() //let store = CNMutableContact() let saveRequest = CNSaveRequest() saveRequest.add(newcontact, toContainerWithIdentifier: nil) do{ //try store.execute(saveRequest) try CNContactStore().execute(saveRequest) print("保存したよ") } catch { print("保存失敗") } } else { self.minyuryokuAlert() } //初回時に連絡先へのアクセスを許可するかのメッセージを表示する let picker = CNContactPickerViewController() picker.delegate = self self.present(picker, 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 } @objc func commitButtonTapped(){ self.view.endEditing(true) } }

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

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

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

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

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

guest

回答1

0

ベストアンサー

info.plistに、Privacy - Contacts Usage Descriptionを追加して、なんか適当にvalueのとこに利用理由を入れてみてください。

回答追記
newcontact.imageData = NSData() as Dataのコードがダメなようです。
コメントアウトして実行したところ保存できました。

投稿2017/11/22 11:24

編集2017/11/22 15:43
fromageblanc

総合スコア2724

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

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

45tigris

2017/11/22 11:32

ありがとうございます。plistの部分はvalueに入れていますが、ダメでした。日本語だとダメなのでしょうか?
fromageblanc

2017/11/22 13:40 編集

大丈夫です。 catchのとこ以下にすると何かわかるかもしれません。 catch let error as Error { print("保存失敗") print(error) }
45tigris

2017/11/24 00:48

ありがとうございます!!できました(>v<)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問