teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

5

画像差し替え

2017/12/05 04:55

投稿

45tigris
45tigris

スコア14

title CHANGED
File without changes
body CHANGED
@@ -237,5 +237,5 @@
237
237
  ```
238
238
  ![1](792e714d2836d96ff1414512ab197ac0.png)
239
239
  ![2](b5f713519bfae7c564b46fb8f18ca839.png)
240
- ![3](c3eccc4475c487ea202f0720b42f899f.png)
240
+ ![3](865cbf5395d19041f51280c07e71cf5f.png)
241
241
  ![4](3f76d6229f819c2b92fcd5688030f80e.png)

4

CNContactPickerViewControllerのチェックを消したいです。

2017/12/05 04:54

投稿

45tigris
45tigris

スコア14

title CHANGED
@@ -1,1 +1,1 @@
1
- 連絡先一覧から情報を取得しアラートで表示したいです。PickerViewのチェックが消えません
1
+ 連絡先CNContactPickerViewControllerのチェックが消えません(初期化したいです)。
body CHANGED
@@ -3,10 +3,12 @@
3
3
  ①ViewControllerに「取得」ボタンを置き、このボタンを押すとiPhoneの連絡先一覧が開きます。
4
4
  ②一覧から任意の人(複数人)を選んでチェックし「Done」を押すと
5
5
   アラートが開き、選択した人が表示されます。
6
- ③そこから**さらに人をタップすると、その人の名前、携帯番号、メールアドレスを表示したいで**
6
+ ③そこからさらに人をタップすると、その人の名前、携帯番号、メールアドレスを表示す
7
+ ④人を選んで情報を取得アラートを表示。
8
+ ⑤4のアラートの「OK」を押すとViewControllerに戻る。
9
+ **⑥再度、ViewControllerの「取得」ボタンを押してiPhoneの連絡先一覧を開くと
10
+ チェックが外れていません。**
7
11
  ******************************************************************
8
- ③までは、なんとかできたのですが、アラートの「OK」を押して**ViewControllerに戻って再度「取得」ボタンを押して連絡先一覧を開くと
9
- チェックが消えていません。**リフレッシュできるのでしょうか?
10
12
  ```ここに言語を入力
11
13
  // ViewController.swift
12
14
  // ToAdressBook
@@ -123,8 +125,10 @@
123
125
  title: self.target[i].name,
124
126
  message: "(self.target[i].email)" + "\n" + "(self.target[i].phNo)",
125
127
  preferredStyle:.alert)
126
- kekkaAlert.addAction(UIAlertAction(title: "OK", style: .default))
128
+ ** kekkaAlert.addAction(UIAlertAction(title: "OK", style: .default))
129
+ **
130
+ **//このOKを押したらCNContactPickerVeiwのチェックを全て外したい。
127
- self.present(kekkaAlert, animated: true, completion: nil)
131
+ **self.present(kekkaAlert, animated: true, completion: nil)
128
132
  print("target name = (self.target[i].name)")
129
133
  print("target email = (self.target[i].email)")
130
134
  print("target phoneNumber = (self.target[i].phNo)")

3

こーどを変更しました。

2017/12/04 06:56

投稿

45tigris
45tigris

スコア14

title CHANGED
@@ -1,1 +1,1 @@
1
- 連絡先一覧から情報を取得しアラートで表示したいです。
1
+ 連絡先一覧から情報を取得しアラートで表示したいです。PickerViewのチェックが消えません
body CHANGED
@@ -5,9 +5,8 @@
5
5
   アラートが開き、選択した人が表示されます。
6
6
  ③そこから**さらに人をタップすると、その人の名前、携帯番号、メールアドレスを表示したいです**。
7
7
  ******************************************************************
8
- ③までは、なんとかできたのですが、**携帯番号、メールアドレスの表示がおかしいです。**
9
- また**ViewControllerに戻って再度「取得」ボタンを押して連絡先一覧を開くと
8
+ では、なんとかできのですが、アラートの「OK」を押して**ViewControllerに戻って再度「取得」ボタンを押して連絡先一覧を開くと
10
- チェックが消えていません。**
9
+ チェックが消えていません。**リフレッシュできるのでしょうか?
11
10
  ```ここに言語を入力
12
11
  // ViewController.swift
13
12
  // ToAdressBook
@@ -24,7 +23,7 @@
24
23
  @IBOutlet weak var phoneNumberField: UITextField!
25
24
  @IBOutlet weak var emailAddressField: UITextField!
26
25
  @IBOutlet weak var givenNameField: UITextField!
27
- var target: [(name:String,email:[CNLabeledValue<NSString>],phNo:[CNLabeledValue<CNPhoneNumber>])] = []
26
+ **var target: [(name:String,email:String,phNo:String)] = []**
28
27
  var nameList:[String] = []
29
28
  let cnPicker = CNContactPickerViewController()
30
29
  //未入力時アラート
@@ -152,8 +151,8 @@
152
151
  func contactPicker(_ picker: CNContactPickerViewController, didSelect contacts: [CNContact]){
153
152
  contacts.forEach { contact in
154
153
  let names = contact.givenName + " " + contact.familyName
155
- let emails = contact.emailAddresses
154
+ let emails = (contact.emailAddresses[0].value as! String)
156
- let phoneNo = contact.phoneNumbers
155
+ let phoneNo = (contact.phoneNumbers[0].value as! CNPhoneNumber).value(forKey: "digits") as! String
157
156
 
158
157
  print("name is = (names)")
159
158
  print("email is = (emails)")

2

コードを変更しました。

2017/12/01 07:33

投稿

45tigris
45tigris

スコア14

title CHANGED
@@ -1,1 +1,1 @@
1
- 連絡先一覧につて教えてください
1
+ 連絡先一覧から情報を取得しアラートで表示したです
body CHANGED
@@ -5,24 +5,99 @@
5
5
   アラートが開き、選択した人が表示されます。
6
6
  ③そこから**さらに人をタップすると、その人の名前、携帯番号、メールアドレスを表示したいです**。
7
7
  ******************************************************************
8
- までは、なんとかできたのですがりません
8
+ までは、なんとかできたのですが、**携帯番号、メールアドレス表示しいです**
9
9
  また**ViewControllerに戻って再度「取得」ボタンを押して連絡先一覧を開くと
10
10
  チェックが消えていません。**
11
- [CNLabeledValue<NSString>]のメールアドレスをStringに変換することはできないのでしょうか?
12
11
  ```ここに言語を入力
12
+ // ViewController.swift
13
+ // ToAdressBook
14
+ // Created by admin on 2017/11/13.
15
+ // Copyright © 2017年 css. All rights reserved.
16
+
13
17
  import UIKit
14
18
  import Contacts
15
19
  import ContactsUI
20
+
16
21
  class ViewController: UIViewController, CNContactPickerDelegate, CNContactViewControllerDelegate {
17
22
 
18
23
  @IBOutlet weak var nameField: UITextField!
19
24
  @IBOutlet weak var phoneNumberField: UITextField!
20
25
  @IBOutlet weak var emailAddressField: UITextField!
21
26
  @IBOutlet weak var givenNameField: UITextField!
22
- var target: [(name:String,email:[CNLabeledValue<NSString>],phNo:CNLabeledValue<CNPhoneNumber>)] = []
27
+ var target: [(name:String,email:[CNLabeledValue<NSString>],phNo:[CNLabeledValue<CNPhoneNumber>])] = []
23
28
  var nameList:[String] = []
24
29
  let cnPicker = CNContactPickerViewController()
30
+ //未入力時アラート
31
+ func minyuryokuAlert() {
32
+ let alert = UIAlertController(
33
+ title: "未入力の欄があります",
34
+ message: "",
35
+ preferredStyle: .alert)
36
+ alert.addAction(UIAlertAction(title:"OK", style: .default))
37
+ self.present(alert, animated: true, completion: nil)
38
+ }
25
39
 
40
+ //「登録」ボタン押下
41
+ @IBAction func registerBTPush(_ sender: Any) {
42
+ //連絡先に追加する可変オブジェクト作成
43
+ let newcontact = CNMutableContact()
44
+ //newcontact.imageData = NSData() as Data //NSDataオブジェクトとしてのプロフィール画像
45
+ //キーボードを下げる
46
+ view.endEditing(true)
47
+ if nameField.text == "" {
48
+ self.minyuryokuAlert()
49
+ }
50
+ if givenNameField.text == "" {
51
+ self.minyuryokuAlert()
52
+ }
53
+ if phoneNumberField.text == "" {
54
+ self.minyuryokuAlert()
55
+ }
56
+ if emailAddressField.text == "" {
57
+ self.minyuryokuAlert()
58
+ }
59
+ //入力欄が空欄だったらエラーを表示。全て入力されていたら保存
60
+ if nameField.text != "" && givenNameField.text != "" && phoneNumberField.text != "" && emailAddressField.text != "" {
61
+ //名前
62
+ let myname = nameField.text!
63
+ newcontact.givenName = myname
64
+ //苗字
65
+ let myFamilyName = givenNameField.text!
66
+ newcontact.familyName = myFamilyName
67
+ //メアド
68
+ let myemail = emailAddressField.text! as NSString
69
+ let myEmail = CNLabeledValue(label:CNLabelHome, value:NSString(string: myemail))
70
+ newcontact.emailAddresses = [myEmail]
71
+ //番号
72
+ let myphoneNo = phoneNumberField.text!
73
+ newcontact.phoneNumbers = [CNLabeledValue(
74
+ label:CNLabelPhoneNumberiPhone,
75
+ value:CNPhoneNumber(stringValue: myphoneNo))]
76
+
77
+ print("お名前:(newcontact.givenName)")
78
+ print("苗字:(newcontact.familyName)")
79
+ print("メアド:(newcontact.emailAddresses)")
80
+ print("番号:(newcontact.phoneNumbers)")
81
+
82
+ //新しく作成した連絡先を保存
83
+ let saveRequest = CNSaveRequest()
84
+ saveRequest.add(newcontact, toContainerWithIdentifier: nil)
85
+ do{
86
+ //try store.execute(saveRequest)
87
+ try CNContactStore().execute(saveRequest)
88
+ print("保存したよ")
89
+ } catch {
90
+ print("保存失敗")
91
+ print(error)
92
+ }
93
+ } else {
94
+ self.minyuryokuAlert()
95
+ }
96
+ //初回時に連絡先へのアクセスを許可するかのメッセージを表示する
97
+ let picker = CNContactPickerViewController()
98
+ picker.delegate = self
99
+ self.present(picker, animated: true, completion: nil)
100
+ }
26
101
  func contactPickerDidCancel(_ picker: CNContactPickerViewController) {
27
102
  print("ContactPickerキャンセルしたよ")
28
103
  }
@@ -37,19 +112,23 @@
37
112
  title:"選択した人",
38
113
  message: "",
39
114
  preferredStyle: .alert)
40
- //アラートにアクション追加
115
+ //アラートにアクション追加(アクション名は選択した人達)
41
116
  for i in 0..<mycount {
42
117
  alert.addAction(
43
118
  UIAlertAction(
44
119
  title: "(nameList[i])",
45
120
  style: .default,
46
121
  handler: {(action) -> Void in
47
- print("(self.nameList[i])")
48
- //各人の情報をタプルから取
122
+ //各アクション(各人の情報をタプル配列から取りアラートで表示)
49
-
123
+ let kekkaAlert = UIAlertController(
50
-
124
+ title: self.target[i].name,
51
-
125
+ message: "(self.target[i].email)" + "\n" + "(self.target[i].phNo)",
52
-
126
+ preferredStyle:.alert)
127
+ kekkaAlert.addAction(UIAlertAction(title: "OK", style: .default))
128
+ self.present(kekkaAlert, animated: true, completion: nil)
129
+ print("target name = (self.target[i].name)")
130
+ print("target email = (self.target[i].email)")
131
+ print("target phoneNumber = (self.target[i].phNo)")
53
132
  })
54
133
  )
55
134
  }
@@ -70,42 +149,24 @@
70
149
  )
71
150
  }
72
151
  //「Done」ボタン押下で選択
73
- private func contactPicker(_ picker: CNContactPickerViewController, didSelectContactProperty contacts: CNContactProperty){
152
+ func contactPicker(_ picker: CNContactPickerViewController, didSelect contacts: [CNContact]){
74
-   //ここで選んだ複数人の情報をタプルで収納したいです。現在エラーになってしまう。
75
153
  contacts.forEach { contact in
76
- let names = contact.givenName + " " + contact.familyName
154
+ let names = contact.givenName + " " + contact.familyName
77
- let emails = CNContactProperty.value?.description
155
+ let emails = contact.emailAddresses
78
- let phoneNo = contact.phoneNumbers
156
+ let phoneNo = contact.phoneNumbers
79
-
157
+
80
- print("name is = (names)")
158
+ print("name is = (names)")
81
- print("email is = (emails)")
159
+ print("email is = (emails)")
82
- print("phoneNo is = (phoneNo)")
160
+ print("phoneNo is = (phoneNo)")
83
- nameList.append(names)
161
+ nameList.append(names)
84
- //タプルの配列"target"に入れる
162
+ //タプルの配列"target"に入れる
85
- target.append((name:names,email:emails,phNo:phoneNo))
163
+ target.append((name:names,email:emails,phNo:phoneNo))
164
+ print("(target)")
86
165
  }
87
166
  let count = nameList.count
88
167
  print("nameList = (nameList)")
89
168
  displayNameList(mycount:count)
90
-
91
169
  }
92
- //func contactPicker(_ picker: CNContactPickerViewController, didSelect contacts: [CNContact]){
93
- // contacts.forEach { contact in
94
- // let names = contact.givenName + " " + contact.familyName
95
- // let emails = CNContactProperty.value?.description
96
- // let phoneNo = contact.phoneNumbers
97
- //
98
- // print("name is = (names)")
99
- // print("email is = (emails)")
100
- // print("phoneNo is = (phoneNo)")
101
- // nameList.append(names)
102
- // //タプルの配列"target"に入れる
103
- // target.append((name:names,email:emails,phNo:phoneNo))
104
- // }
105
- // let count = nameList.count
106
- // print("nameList = (nameList)")
107
- // displayNameList(mycount:count)
108
- //}
109
170
  //「一覧」ボタンを押下。連絡先を取得
110
171
  @IBAction func getMyContact(_ sender: Any) {
111
172
  nameList = []
@@ -116,22 +177,62 @@
116
177
  cnPicker.delegate = self
117
178
  self.present(cnPicker, animated: true, completion: nil)
118
179
 
119
- }
180
+ }
181
+
182
+ //名前入力欄を消去
183
+ @IBAction func NameFieldDelete(_ sender: Any) {
184
+ nameField.text = ""
185
+ }
186
+
187
+ @IBAction func givenNameDelete(_ sender: Any) {
188
+ givenNameField.text = ""
189
+ }
190
+ //電話番号入力欄を消去
191
+ @IBAction func phoneNumFieldDelete(_ sender: Any) {
192
+
193
+ phoneNumberField.text = ""
194
+ }
195
+ func addAddressSave(){
196
+
197
+ }
198
+ //emailアドレス入力欄を消去
199
+ @IBAction func emailFieldDelete(_ sender: Any) {
200
+ emailAddressField.text = ""
201
+ }
202
+
120
203
  override func viewDidLoad() {
121
204
  super.viewDidLoad()
122
205
 
123
206
  }
207
+
124
208
  override func didReceiveMemoryWarning() {
125
209
  super.didReceiveMemoryWarning()
126
210
  // Dispose of any resources that can be recreated.
127
211
  }
212
+ ////キーボードに閉じるボタンをつける
213
+ func makeKeyboard(){
214
+ //仮のサイズでツールバー作成
215
+ let kbToolBar = UIToolbar(frame: CGRect(x: 0,y: 0, width: 320, height: 40))
216
+ kbToolBar.barStyle = UIBarStyle.default //スタイル設定
217
+ kbToolBar.sizeToFit() //画面に合わせてサイズ調整
218
+ //スペーサー
219
+ let spacer = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.fixedSpace, target: self, action: nil)
220
+ //閉じるボタン
221
+ let commitButton = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.done, target: self, action: #selector(ViewController.commitButtonTapped))
222
+ kbToolBar.items = [spacer, commitButton]
223
+ nameField.inputAccessoryView = kbToolBar
224
+ phoneNumberField.inputAccessoryView = kbToolBar
225
+ emailAddressField.inputAccessoryView = kbToolBar
226
+ givenNameField.inputAccessoryView = kbToolBar
227
+
228
+ }
128
- @objc func commitButtonTapped(){
229
+ @objc func commitButtonTapped(){
129
230
  self.view.endEditing(true)
130
231
  }
131
232
 
132
233
  }
133
-
134
234
  ```
135
-
136
- ![手順②連絡先一覧](adca24e38170b7a0782ca74f643e9f8a.png)
235
+ ![1](792e714d2836d96ff1414512ab197ac0.png)
137
- ![手順②選択した人を表示](b5f713519bfae7c564b46fb8f18ca839.png)
236
+ ![2](b5f713519bfae7c564b46fb8f18ca839.png)
237
+ ![3](c3eccc4475c487ea202f0720b42f899f.png)
238
+ ![4](3f76d6229f819c2b92fcd5688030f80e.png)

1

コードを書き換えました。

2017/12/01 06:00

投稿

45tigris
45tigris

スコア14

title CHANGED
File without changes
body CHANGED
@@ -8,27 +8,28 @@
8
8
  ②までは、なんとかできたのですがその先が分かりません。
9
9
  また**ViewControllerに戻って再度「取得」ボタンを押して連絡先一覧を開くと
10
10
  チェックが消えていません。**
11
+ [CNLabeledValue<NSString>]のメールアドレスをStringに変換することはできないのでしょうか?
11
12
  ```ここに言語を入力
12
- //
13
- // ViewController.swift
14
- // ToAdressBook
15
- //
16
- // Created by admin on 2017/11/13.
17
- // Copyright © 2017年 css. All rights reserved.
18
- //
19
-
20
13
  import UIKit
21
14
  import Contacts
22
15
  import ContactsUI
23
-
24
16
  class ViewController: UIViewController, CNContactPickerDelegate, CNContactViewControllerDelegate {
25
-   var nameList:[String] = []
26
- let cnPicker = CNContactPickerViewController()
27
17
 
18
+ @IBOutlet weak var nameField: UITextField!
19
+ @IBOutlet weak var phoneNumberField: UITextField!
20
+ @IBOutlet weak var emailAddressField: UITextField!
21
+ @IBOutlet weak var givenNameField: UITextField!
22
+ var target: [(name:String,email:[CNLabeledValue<NSString>],phNo:CNLabeledValue<CNPhoneNumber>)] = []
23
+ var nameList:[String] = []
24
+ let cnPicker = CNContactPickerViewController()
25
+
26
+ func contactPickerDidCancel(_ picker: CNContactPickerViewController) {
27
+ print("ContactPickerキャンセルしたよ")
28
+ }
29
+
28
30
  //選んた人をアラートで表示
29
31
  func displayNameList(mycount:Int){
30
32
  print("飛んだよ")
31
- //ここが不安
32
33
  self.cnPicker.dismiss(animated: false) {
33
34
  print("閉じたよ?")
34
35
  }
@@ -36,7 +37,7 @@
36
37
  title:"選択した人",
37
38
  message: "",
38
39
  preferredStyle: .alert)
39
- //アラートにアクション追加(各アクションのタイトルは選択した人の名前)
40
+ //アラートにアクション追加
40
41
  for i in 0..<mycount {
41
42
  alert.addAction(
42
43
  UIAlertAction(
@@ -44,8 +45,11 @@
44
45
  style: .default,
45
46
  handler: {(action) -> Void in
46
47
  print("(self.nameList[i])")
47
-
48
-              //ここで選択した人の情報をアラートで表示したい。
48
+ //人の情報をタプルから取得
49
+
50
+
51
+
52
+
49
53
  })
50
54
  )
51
55
  }
@@ -65,18 +69,43 @@
65
69
  }
66
70
  )
67
71
  }
68
- //「Done」ボタン押下で選択された人達の名前を表示
72
+ //「Done」ボタン押下で選択
69
- func contactPicker(_ picker: CNContactPickerViewController, didSelect contacts: [CNContact]){
73
+ private func contactPicker(_ picker: CNContactPickerViewController, didSelectContactProperty contacts: CNContactProperty){
74
+   //ここで選んだ複数人の情報をタプルで収納したいです。現在エラーになってしまう。
70
75
  contacts.forEach { contact in
71
- let names = contact.familyName + " " + contact.givenName
76
+ let names = contact.givenName + " " + contact.familyName
77
+ let emails = CNContactProperty.value?.description
78
+ let phoneNo = contact.phoneNumbers
79
+
72
80
  print("name is = (names)")
81
+ print("email is = (emails)")
82
+ print("phoneNo is = (phoneNo)")
73
83
  nameList.append(names)
84
+ //タプルの配列"target"に入れる
85
+ target.append((name:names,email:emails,phNo:phoneNo))
74
86
  }
75
87
  let count = nameList.count
76
88
  print("nameList = (nameList)")
77
89
  displayNameList(mycount:count)
78
-
90
+
79
91
  }
92
+ //func contactPicker(_ picker: CNContactPickerViewController, didSelect contacts: [CNContact]){
93
+ // contacts.forEach { contact in
94
+ // let names = contact.givenName + " " + contact.familyName
95
+ // let emails = CNContactProperty.value?.description
96
+ // let phoneNo = contact.phoneNumbers
97
+ //
98
+ // print("name is = (names)")
99
+ // print("email is = (emails)")
100
+ // print("phoneNo is = (phoneNo)")
101
+ // nameList.append(names)
102
+ // //タプルの配列"target"に入れる
103
+ // target.append((name:names,email:emails,phNo:phoneNo))
104
+ // }
105
+ // let count = nameList.count
106
+ // print("nameList = (nameList)")
107
+ // displayNameList(mycount:count)
108
+ //}
80
109
  //「一覧」ボタンを押下。連絡先を取得
81
110
  @IBAction func getMyContact(_ sender: Any) {
82
111
  nameList = []
@@ -87,26 +116,21 @@
87
116
  cnPicker.delegate = self
88
117
  self.present(cnPicker, animated: true, completion: nil)
89
118
 
90
- }
119
+ }
91
-
92
-
93
120
  override func viewDidLoad() {
94
121
  super.viewDidLoad()
95
122
 
96
123
  }
97
-
98
124
  override func didReceiveMemoryWarning() {
99
125
  super.didReceiveMemoryWarning()
100
126
  // Dispose of any resources that can be recreated.
101
127
  }
102
-
103
- @objc func commitButtonTapped(){
128
+ @objc func commitButtonTapped(){
104
129
  self.view.endEditing(true)
105
130
  }
106
131
 
107
132
  }
108
133
 
109
-
110
134
  ```
111
135
 
112
136
  ![手順②連絡先一覧](adca24e38170b7a0782ca74f643e9f8a.png)