我想创建一个简单的对象助手来在我的Swift 2.0应用程序的许多地方发送短信,并在下一步中创建另一个助手(电子邮件,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。我确认:当我添加smsHelper对象作为'SomeClass'的成员时,它起作用了-调用了委托。

问题是:这样做的最佳实践是什么,添加一个成员对我来说不是一个选择,因为许多类都可以使用它,而且创建一个单例的appDelegate成员我也很愚蠢。如何强制不删除范围函数末尾的对象?

最佳答案

尝试使用单例方式来做到这一点:

class SmsHelper: MFMessageComposeViewControllerDelegate {
   static let sharedInstance = SmsHelper()
   private init() {}
}


和用法:

SmsHelper.sharedInstance().sendSms('some text')


编辑:
   如果您添加了与抽象类不同的init方法。

 private override init(message: String){
        super.init()
    }


然后将定义更改为static let sharedInstance = SmsHelper(message:"smsHelper")不会很复杂。

对于您的代表,只需将其分配出init方法,在UIViewController viewDidLoad中,

SmsHelper.sharedInstance().delegate = self

关于ios - 如何快速等待ui委托(delegate),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34411159/

10-12 00:18