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

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

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

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

Swift

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

Q&A

解決済

1回答

660閲覧

Swift4で,アプリユーザーが端末内に登録したメールアドレスを宛先に自動入力させたい

ddd_prog

総合スコア5

Xcode

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

Swift

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

0グッド

0クリップ

投稿2020/01/07 09:52

編集2020/01/07 11:38

前提・実現したいこと

現在、アプリ内からメーラーを立ち上げることのできるiOSアプリを作成していて、ユーザーが登録した情報を自動入力させる機能の実装を行なっています.
端末にメールアドレスの保存はできているのですが,宛先に自動入力させることができません.
データが正しく保存されていることの確認とLabelへの表示はできています.

ググってみると
どれもメールアドレスをプログラム内で入力してしまっているため解決方法がわかりません.
この方法ではうまくいったのですが,いざ登録した情報を呼び出そうとすると

発生している問題・エラーメッセージ

Cannot convert value of type 'String?' to expected argument type '[String]?'

というメッセージが出てしまいます.

該当のソースコード

Swift

1class ViewController: UIViewController, MFMailComposeViewControllerDelegate ,CLLocationManagerDelegate{ 2 @IBOutlet weak var sendMail: UILabel! 3 @IBOutlet weak var address: UILabel! 4 5 var testText:String = "default" 6 7 //②UserDefaults のインスタンス 8 let userDefaults = UserDefaults.standard 9 10 var locationManager: CLLocationManager! 11 12 override func viewDidLoad() { 13 super.viewDidLoad() 14 setupLocationManager() 15 // デフォルト値 16 userDefaults.register(defaults: ["DataStore": "default"]) 17 address.text = readData() 18 } 19 20 21 @IBAction func sendMail(sender: Any) { 22 let toRecipients = address.text 23 if MFMailComposeViewController.canSendMail() { 24 let mail = MFMailComposeViewController() 25 mail.mailComposeDelegate = self 26 mail.setToRecipients(toRecipients) // 宛先アドレス 27 mail.setSubject("はじめまして") // 件名 28 mail.setMessageBody("こんにちは", isHTML: false) // 本文 29 present(mail, animated: true, completion: nil) 30 } else { 31 print("送信できません") 32 } 33 } 34 35@IBAction func sendMail2(sender: Any) { 36 let toRecipients2 = "xxx@co.jp" 37 if MFMailComposeViewController.canSendMail() { 38 let mail = MFMailComposeViewController() 39 mail.mailComposeDelegate = self 40 mail.setToRecipients([toRecipients2]) // 宛先アドレス 41 mail.setSubject("はじめまして"") // 件名 42 mail.setMessageBody("こんにちは", isHTML: false) // 本文 43 present(mail, animated: true, completion: nil) 44 } else { 45 print("送信できません") 46 } 47 } 48 49 func readData() -> String { 50 // Keyを指定して読み込み 51 let str: String = userDefaults.object(forKey: "DataStore") as! String 52 53 return str 54 } 55 func saveData(str: String){ 56 57 // Keyを指定して保存 58 userDefaults.set(str, forKey: "DataStore") 59 60 }

試したこと

Swift

1let toRecipients = address.text

Swift

1let toRecipients = "xxxxx@co.jp"

にした場合は正しく表示されます.

また,toRecipientsを使わず

Swift

1mail.setToRecipients("(textField.text ?? "なし")")

としてもうまくいきません.

コード全体が長いため全体は載せておりませんが,当方未熟のため大事なところをカットしてしまっているかもしれません.足りない部分がありましたら補足いたしますのでご指摘ください.
よろしくお願いします.

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2020/01/07 10:01

address.textのadressってなんですか?
ddd_prog

2020/01/07 10:08

ご指摘ありがとうございます. Labelの名前です. @IBOutlet weak var workPlaces22: UILabel! としてClass ViewController内で定義しております.
退会済みユーザー

退会済みユーザー

2020/01/07 10:14

workPlace22? @IBOutlet weak var adress: UILabel! ってことですか?
ddd_prog

2020/01/07 10:18

修正をし忘れていましたすみません.そういうことです
退会済みユーザー

退会済みユーザー

2020/01/07 10:27 編集

setToRecipientsは、sが付いてるので、複数の宛先を受けとれるようになってると思います。stringの配列を渡してください。([toRecipients])で試してみて けど、let toRecipients = "xxxxx@co.jp"でうまく行くっておかしいな…
ddd_prog

2020/01/07 10:39

ありがとうございます.早速試してみたのですが Value of optional type 'String?' must be unwrapped to a value of type 'String' というエラーが出てしまったので([toRecipients!])と変更したらエラーはなくなりました. ただ,実行してみたところメールアドレスは自動入力されていませんでした. また,address.text = readData() でreadData()の値を代入しているので, let toRecipients = address.text を let toRecipients = readData() と変更したところ [(toRecipients)] でエラーは消えましたがメールアドレスは同じく自動入力されませんでした.
退会済みユーザー

退会済みユーザー

2020/01/07 10:47

func sendMail()のなかで、 print(readData())すると、コンソールに何が表示されますか?
ddd_prog

2020/01/07 11:10 編集

ありがとうございます. print(readData())だと xxxx@co.jp print(address.text)やprint(toRecipients) だと端末に保存した内容が Optional("xxxx@co.jp") のように表示されました.
退会済みユーザー

退会済みユーザー

2020/01/07 11:23 編集

readData()でユーザーデフォルトのあたいがよみこめないのに、ラベルに読み込めない値が表示されるの? -- 追記 -- userDefaultから値は取り出せるわけですね。 オプショナルはラベルのテキストに入れてから取り出してるからです。
ddd_prog

2020/01/07 11:25

print(address.text)とprint(toRecipients)では Expression implicitly coerced from 'String?' to 'Any' というエラーが表示されているのを無視して強引にやってしまっているので,それが混乱させるやってはいけないことだったりしたらすみません... ただ,ラベルを用意してadd.textを表示させるのはうまくいくためデータの保存はうまくいっていると思うので,なぜかメーラーへの自動入力ができないということになっています. mail.setToRecipients(["xxxx@co.jp"]) だと正しく入力されます.
guest

回答1

0

ベストアンサー

公式

に↓のように書いてあるんですが、ざっくりいうと、初回設定はできるが、後ほど変更できないってかいてあるのかな?
**Important

After presenting a mail compose view controller, the system ignores any attempts to modify the email using the methods of this class. The user can still edit the content of the email, but your app cannot. Therefore, always configure the fields of your email before presenting the view controller.

自分の方でも試したのですが、アプリを削除すれば違う文字列(メールアドレス形式でなくてもOK)を設定できるのですが、アプリを削除しないでコード上で行おうとしても変更が反映されません。

アプリを一度削除することが問題なければ、一度削除した後、[String]を渡してあげてみてください。宛先が変更されると思います。
[String?]はコンパイル通らないので気をつけて。[String]?なのでnilを渡すと空欄のままになってしまいますのでこれも気をつけて。

この説明で行くと、let toRecipients = "xxxxx@co.jp"で成功したというのも
成功していたのではなく、以前に成功した文字列がそのまま残っていただけということで、説明ができます。

変数で設定する方法があるのか後ほど探してみたいと思います。

短時間で調べたことなので、誤りなどありましたらご指摘ください。

投稿2020/01/07 11:56

編集2020/01/07 12:00
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

ddd_prog

2020/01/07 12:27

アプリを削除しても動作に全く代わりがなかったのですが, 仕様上,変数で設定したメールアドレスを変更することは難しいということであってますかね? 調べてくださりありがとうございました!
退会済みユーザー

退会済みユーザー

2020/01/07 12:33

こちらでは、変更が反映されましたよ。アドレスに文字列を設定するまえに、設定する文字列をキチンと監視してみてください。
ddd_prog

2020/01/07 12:56

ありがとうございます!私の使用していたタイプのメールアドレスが特別反映されないタイプのものだったみたいで,ほかのものを試したところ無事できました! 長時間お付き合いくださり本当にありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問