我想创建简单的对象帮助器,以便在我的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)
我从来没有打过电话,应用程序因内存泄漏而崩溃,我知道原因:是因为SmsHelper对象在someFunction'在此函数的结束范围之后删除,并且此对象为nil,并且系统尝试在nil对象处调用didFinishWithResult。我确认一下:当我添加smsHelper对象作为“SomeClass'”的成员时它工作 - 委托被称为。
问题是:做到这一点的最佳做法是什么,添加一个成员对我来说不是一个选项,因为很多类都可以使用它,也创建一个单例,appDelegate成员我认为非常愚蠢。如何在范围函数结束时强制不删除对象?
答案 0 :(得分: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
UIViewController
viewDidLoad
方法中分配即可。
SmsHelper.sharedInstance().delegate = self
答案 1 :(得分: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
}
}
}