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

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

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

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

Swift

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

Q&A

1回答

2477閲覧

他のクラスからDelegateメソッドを呼ぶ方法

todayske

総合スコア36

Xcode

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

Swift

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

0グッド

0クリップ

投稿2016/06/03 10:41

Swiftでアプリを作っていて、色んなアプリで使うメソッドはまとめて再利用できるようにしたいと考えています。
そこでメールを送るメソッドを共通で使うためのクラスに入れたところ、Delegateが原因でDelegateメソッド(という名前なのかもよく分かっていないのですが)困っています。

どうにか解決する方法はないでしょうか。
よろしくお願いいたします。

Swift

1import MessageUI 2 3//呼ぶクラス 4class ViewController: UIViewController{ 5 override func viewDidLoad() { 6 super.viewDidLoad() 7 Common.sendMail(self) //こんな風に書きたいです。 8 } 9} 10 11//呼ばれるクラス 12class Common:NSObject{ 13 class func sendMail(vc:UIViewController) { 14 if MFMailComposeViewController.canSendMail()==false { 15 print("Email Send Failed") 16 return 17 } 18 19 let mailViewController = MFMailComposeViewController() 20 mailViewController.mailComposeDelegate = vc 21 mailViewController.setSubject("エラー出ませんように") 22 let toRecipients = ["noerror_nolife@gmail.com"] 23 mailViewController.setToRecipients(toRecipients) 24 mailViewController.setMessageBody("", isHTML: false) 25 vc.presentViewController(mailViewController, animated: true, completion: nil) 26 } 27} 28

エラー文

Cannot assign value of type 'UIViewController' to type 'MFMailComposeViewControllerDelegate?'

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

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

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

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

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

guest

回答1

0

実機で取りあえず動くことを確認しました。
もっとスマートな書き方があると思いますが、参考にしてみてください。

swift

1import UIKit 2import MessageUI 3 4//呼ぶクラス 5class ViewController: UIViewController, MFMailComposeViewControllerDelegate { 6 7 override func viewDidLoad() { 8 super.viewDidLoad() 9 Common.sendMail(self) 10 } 11 12 func mailComposeController(controller: MFMailComposeViewController, didFinishWithResult result: MFMailComposeResult, error: NSError?) { 13 14 switch result.rawValue { 15 case MFMailComposeResultCancelled.rawValue: 16 print("Email Send Cancelled") 17 break 18 case MFMailComposeResultSaved.rawValue: 19 print("Email Saved as a Draft") 20 break 21 case MFMailComposeResultSent.rawValue: 22 print("Email Sent Successfully") 23 break 24 case MFMailComposeResultFailed.rawValue: 25 print("Email Send Failed") 26 break 27 default: 28 break 29 } 30 dismissViewControllerAnimated(true, completion: nil) 31 } 32} 33 34// 呼ばれるクラス 35class Common:NSObject, MFMailComposeViewControllerDelegate { 36 class func sendMail<T: UIViewController where T: MFMailComposeViewControllerDelegate>(vc: T) { 37 if MFMailComposeViewController.canSendMail()==false { 38 print("Email Send Failed") 39 return 40 } 41 42 let mailViewController = MFMailComposeViewController() 43 mailViewController.mailComposeDelegate = vc 44 mailViewController.setSubject("エラー出ませんように") 45 let toRecipients = ["noerror_nolife@gmail.com"] 46 mailViewController.setToRecipients(toRecipients) 47 mailViewController.setMessageBody("", isHTML: false) 48 vc.presentViewController(mailViewController, animated: true, completion: nil) 49 } 50}

追加質問の回答

swift

1import UIKit 2import MessageUI 3 4//呼ぶクラス 5class ViewController: UIViewController { 6 7 // インスタンスとして保持 8 var common: Common! 9 10 override func viewDidLoad() { 11 super.viewDidLoad() 12 common = Common().sendMail(self) 13 } 14} 15 16// 呼ばれるクラス 17class Common:NSObject, MFMailComposeViewControllerDelegate { 18 19 var vc: UIViewController! 20 21 func sendMail(vc: UIViewController) -> Common? { 22 if MFMailComposeViewController.canSendMail()==false { 23 print("Email Send Failed") 24 return nil; 25 } 26 27 self.vc = vc 28 let mailViewController = MFMailComposeViewController() 29 mailViewController.mailComposeDelegate = self 30 mailViewController.setSubject("エラー出ませんように") 31 let toRecipients = ["noerror_nolife@gmail.com"] 32 mailViewController.setToRecipients(toRecipients) 33 mailViewController.setMessageBody("", isHTML: false) 34 vc.presentViewController(mailViewController, animated: true, completion: nil) 35 return self 36 } 37 38 func mailComposeController(controller: MFMailComposeViewController, didFinishWithResult result: MFMailComposeResult, error: NSError?) { 39 40 switch result.rawValue { 41 case MFMailComposeResultCancelled.rawValue: 42 print("Email Send Cancelled") 43 break 44 case MFMailComposeResultSaved.rawValue: 45 print("Email Saved as a Draft") 46 break 47 case MFMailComposeResultSent.rawValue: 48 print("Email Sent Successfully") 49 break 50 case MFMailComposeResultFailed.rawValue: 51 print("Email Send Failed") 52 break 53 default: 54 break 55 } 56 vc.dismissViewControllerAnimated(true, completion: nil) 57 } 58} 59

投稿2016/06/03 11:40

編集2016/06/04 10:38
_Kentarou

総合スコア8490

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

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

todayske

2016/06/03 23:55

ご回答ありがとうございます! もし可能であれば mailComposeController(controller: MFMailComposeViewController, didFinishWithResult result: MFMailComposeResult, error: NSError?) を呼ぶ方のクラスに書かない方法があると呼ぶ側のコードが少なくなってもっと便利なように思えるのですが、やはりそれは難しいでしょうか?
_Kentarou

2016/06/04 00:26

追加質問の回答として追記しました、確認してみてください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問