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

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

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

SpriteKitは、iOSやOS Xで使用できるApple社製の2Dゲーム開発フレームワークです。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

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

Q&A

解決済

1回答

1030閲覧

Swift SpriteKit上でMFMailComposeViewControllerで作成したmail作成画面が閉じれない

TakamasaIijima

総合スコア16

SpriteKit

SpriteKitは、iOSやOS Xで使用できるApple社製の2Dゲーム開発フレームワークです。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

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

0グッド

0クリップ

投稿2019/01/08 04:30

編集2019/01/08 05:14

前提・実現したいこと

Swift+SpriteKitで2Dのゲームを作っています。
MessageUI.frameworkを使って
spritekitnodeをタップしたらMFMailComposeViewControllerでメールの作成画面を表示し、送信/下書き/キャンセルのいずれかが処理されたらメールの作成画面を閉じたいです。
現状はタップ->メール作成画面の表示までは実装できました。

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

上記のメール処理の実行後も作成画面が消えず、そのままの画面(メール作成画面)になってしまいます。

該当のソースコード

swift

1 2 var mailViewController = MFMailComposeViewController() 3 4 @IBAction func sendMail() { 5 //メールを送信できるかチェック 6 if MFMailComposeViewController.canSendMail()==false { 7 print("Email Send Failed") 8 return 9 } 10 11 var mailViewController = MFMailComposeViewController() 12 var toRecipients = ["XXXX@gmail.sampledomainX"] 13 14 mailViewController.mailComposeDelegate = self 15 mailViewController.setSubject("メールの件名") 16 mailViewController.setToRecipients(toRecipients) //Toアドレスの表示 17 mailViewController.setMessageBody("メールの本文", isHTML: false) 18 var currentViewController : UIViewController? = UIApplication.shared.keyWindow?.rootViewController! 19 currentViewController?.present(mailViewController, animated: true, completion: nil) 20 } 21 22 func mailComposeController(controller: MFMailComposeViewController, didFinishWithResult result: MFMailComposeResult, error: NSError?) { 23 if result == MFMailComposeResult.cancelled { 24 print("メール送信がキャンセルされました") 25 } else if result == MFMailComposeResult.saved { 26 print("下書きとして保存されました") 27 } else if result == MFMailComposeResult.sent { 28 print("メール送信に成功しました") 29 } else if result == MFMailComposeResult.failed { 30 print("メール送信に失敗しました") 31 } 32 33 mailViewController.dismiss(animated: true, completion: nil) //閉じる 34 }

試したこと

StackOverflowにdismissで画面を消す方法が書いてありましたので試してみましたが出来ませんでした。
https://stackoverflow.com/questions/37366763/how-can-i-dismiss-a-viewcontroller-from-my-gamescene-swift

メール画面作成で参考にしたサイト

補足情報(FW/ツールのバージョンなど)

Xcode Version 10.1 (10B61)
Swift3

回答をいただいた後に編集しました。(回答箇所は未編集)

swift

1 2 var mailViewController = MFMailComposeViewController() 3 let currentViewController : UIViewController? = UIApplication.shared.keyWindow?.rootViewController! //<=追記 4 @IBAction func sendMail() { 5 //メールを送信できるかチェック 6 if MFMailComposeViewController.canSendMail()==false { 7 print("Email Send Failed") 8 return 9 } 10 11 var mailViewController = MFMailComposeViewController() 12 var toRecipients = ["XXXX@gmail.sampledomainX"] 13 14 mailViewController.mailComposeDelegate = self 15 mailViewController.setSubject("メールの件名") 16 mailViewController.setToRecipients(toRecipients) //Toアドレスの表示 17 mailViewController.setMessageBody("メールの本文", isHTML: false) 18 //var currentViewController : UIViewController? = UIApplication.shared.keyWindow?.rootViewController! 19 currentViewController?.present(mailViewController, animated: true, completion: nil) 20 } 21 22 func mailComposeController(controller: MFMailComposeViewController, didFinishWithResult result: MFMailComposeResult, error: NSError?) { 23 if result == MFMailComposeResult.cancelled { 24 print("メール送信がキャンセルされました") 25 } else if result == MFMailComposeResult.saved { 26 print("下書きとして保存されました") 27 } else if result == MFMailComposeResult.sent { 28 print("メール送信に成功しました") 29 } else if result == MFMailComposeResult.failed { 30 print("メール送信に失敗しました") 31 } 32 33 currentViewController?.dismiss(animated: true, completion: nil) 34 35 //mailViewController.dismiss(animated: true, completion: nil) //閉じる <= Controllerを間違えていたので編集 36 }

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

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

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

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

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

guest

回答1

0

ベストアンサー

func mailComposeController(controller: MFMailComposeViewController, didFinishWithResult result: MFMailComposeResult, error: NSError?) {

ではなく

func mailComposeController(_ controller: MFMailComposeViewController, didFinishWith result: MFMailComposeResult, error: Error?) {

が正解です。
(たぶんxcode上で黄色く警告が出ていたと思いますが)

投稿2019/01/08 05:03

takabosoft

総合スコア8356

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

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

TakamasaIijima

2019/01/08 05:11

ありがとうございます! アドバイスいただいた内容と他の箇所を見直したら動きました! ちなみにこの2個のメソッド引数の違いをご教授いただけませんでしょうか?...
takabosoft

2019/01/08 05:16

たぶんどこかの少し古いサイトを参考にしたのだと思いますが、Xcodeのバージョンが上がるとSDKの各種型の定義も変わることがあります。よく見ると引数の数は一緒ですが、微妙に関数の名前が異なるのがわかると思います。関数の名前が少しでも違うと、プロトコルの関数を実装したことにはなりません。実装しなければいけない関数名は今回で言えば「MFMailComposeViewControllerDelegate」型の定義にジャンプすれば判ります。
TakamasaIijima

2019/01/08 06:05

なるほど、型の定義にジャンプしてそのバージョンでの必要な関数を確認すべきなのですね! ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問