0

Swift 2.0 アプリの多くの場所で SMS を送信するための単純なオブジェクト ヘルパーを作成し、次のステップで別のヘルパー (電子メール、PDF オープナーなど) を作成したいと考えています。

私は単純なクラスを作成します:

import Foundation
import MessageUI

class SmsHelper: MFMessageComposeViewControllerDelegate {

    func sendSMS(body: String){
        if (MFMessageComposeViewController.canSendText()){
            let messageVC = MFMessageComposeViewController()
            messageVC.body = body
            //messageVC.recipients = ["Enter tel-nr"]
            messageVC.messageComposeDelegate = self;
            AppDelegate().sharedInstance().getTopController().presentViewController(messageVC, animated: false, completion: nil)

        }
        else{
            //do some alert etc.
        }
    }


    func messageComposeViewController(controller: MFMessageComposeViewController, didFinishWithResult result: MessageComposeResult){
        sendSMSRsp(result, errorMsg: nil)
        controller.dismissViewControllerAnimated(true, completion: nil)
        print("sms didFinishWithResult")
    }
}

私はそれをしたいコードのどこにでも:

class someAnotherClass{
  func someFunction(){
    let smsHelper = SmsHelper()
    smsHelper.sendSms("some text")
  }
}

sms iosエディターが開いていますが、閉じたり送信したりしたいときに閉じません。関数をmessageComposeViewController(controller: MFMessageComposeViewController, didFinishWithResult result: MessageComposeResult)呼び出したことがないため、メモリリークでアプリがクラッシュします。理由はわかっています。「someFunction」のSmsHelperオブジェクトが終了後に削除されているためです。この関数のスコープ、およびこのオブジェクトは nil であり、システムは nil オブジェクトで didFinishWithResult を呼び出そうとします。私はそれを確認します:「SomeClass」のメンバーとしてsmsHelperオブジェクトを追加すると、機能しました-デリゲートが呼び出されます。

質問は:それを行うためのベストプラクティスは何ですか.メンバーを追加することは私にとってオプションではありません.多くのクラスがそれを使用でき、シングルトンを作成することもできます.appDelegateメンバーはかなりばかげていると思います. スコープ関数の最後でオブジェクトを強制的に削除しないようにする方法は?

4

2 に答える 2

0

私にとって、これを行う方法は、クロージャーの型エイリアスを作成し、この型エイリアスのオプションの変数を格納することです。sendSMS を呼び出すときは、クロージャを渡して変数に設定します。次に、それをデリゲートで呼び出すことができます。デリゲートは、sendSMS のクロージャーを介してそれを渡します。

import Foundation
import MessageUI

class SmsHelper: MFMessageComposeViewControllerDelegate {

    let messageVC: MFMessageComposeViewController!
    typealias SMSCompletion = (result: MessageComposeResult, errorMsg: NSError?) -> ()
    var sendSMSRsp: SMSCompletion?

    func sendSMS(body: String, completion: SMSCompletion){
        sendSMSRsp = completion
        if (MFMessageComposeViewController.canSendText()){
            messageVC = MFMessageComposeViewController()
            messageVC.body = body
            //messageVC.recipients = ["Enter tel-nr"]
            messageVC.messageComposeDelegate = self;
            AppDelegate().sharedInstance().getTopController().presentViewController(messageVC, animated: false, completion: nil)

        } else {
            //do some alert etc.
        }
    }


    func messageComposeViewController(controller: MFMessageComposeViewController, didFinishWithResult result: MessageComposeResult){
        sendSMSRsp?(result: result, errorMsg: nil)
        controller.dismissViewControllerAnimated(true, completion: nil)
        print("sms didFinishWithResult")
    }
}

class SomeOtherClass {

    func someFunction() {
        let smsHelper = SmsHelper()
        smsHelper.sendSMS("some text") { (result, errorMsg) -> () in

        }
    }

}
于 2015-12-22T10:07:02.960 に答える