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

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

ただいまの
回答率

91.37%

  • Swift

    5026questions

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

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

解決済

回答 1

投稿 2017/11/22 16:17

  • 評価
  • クリップ 0
  • VIEW 78

45tigris

score 1

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)
    }

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

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

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

投稿 2017/11/22 20:24

編集 2017/11/23 00:43

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/11/22 20:32

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

    キャンセル

  • 2017/11/22 22:40 編集

    大丈夫です。
    catchのとこ以下にすると何かわかるかもしれません。

    catch let error as Error {

    print("保存失敗")
    print(error)

    }

    キャンセル

  • 2017/11/24 09:48

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

    キャンセル

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

ただいまの回答率

91.37%

関連した質問

同じタグがついた質問を見る

  • Swift

    5026questions

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