2015-12-22 90 views
0

我要创建简单对象帮手对我的雨燕2.0的应用程序发送许多地方的短信UI代理,并在接下来的步骤中的另一助手(电子邮件,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") 
    } 
} 

所以短信IOS编辑器中打开,但是当我想关闭或发送,这不排除,功能messageComposeViewController(controller: MFMessageComposeViewController, didFinishWithResult result: MessageComposeResult)我从来没有调用和应用程序崩溃的内存泄漏,我知道的原因:是因为'someFunction'中的SmsHelper对象正在删除此函数的结束范围后,此对象为零,并且系统尝试调用didFinishWithResult在零对象。我确认它:当我添加smsHelper对象作为'SomeClass'的成员时它工作 - 调用委托。

问题是:做这件事的最佳做法是什么,添加一个成员对我来说不是一种选择,因为许多类可以使用它,也创建一个单例,appDelegate成员是我认为很愚蠢的。如何强制不删除作用域结束时的对象?

回答

0

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

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方法,在UIViewControllerviewDidLoad

SmsHelper.sharedInstance().delegate = self 
+0

它的工作,但可能有点复杂,如果SmsHelper具有自定义构造函数父母,为前,当我有3类: SmsHelper,PdfHelper,EmailHelper和具有构造函数Helper(body:String)的抽象类Helper,我开始阅读关于NSOperation的信息,可以使用NSOperation来解决这个问题吗? – luky0007

+0

抱歉,我迷失了你所说的,但为什么你需要抽象类?如果添加一些方法可以获得耦合。为什么不?所有的助手应该是NSObject的子类。从我的角度来看。如果这个答案有帮助,请接受它。 –

+0

我看到他描述'也创建一个单身人士,我认为appDelegate成员很愚蠢。 ' –

0

对我来说,这样做的方法是创建一个封闭的类型ALIS,然后存储的这种类型别名的可选变量。当你调用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 

     } 
    } 

} 
+0

这段代码对我来说是优雅的解决方案,但它不起作用,'messageComposeViewController didFinishWithResult'永远不会被调用。 – luky0007

+0

这听起来像是一个问题,因为委托没有正确设置。我认为你需要在函数之外创建'MFMessageComposeViewController',我会改变我的答案。 – Swinny89

+0

当你回答 - 我移动功能的MFMessageComposeViewController之外 - 仍然没有工作和崩溃,看起来像smshelper对象在sendSms范围的末尾删除。 – luky0007