我正在尝试创建一个负责使用MFMailComposeViewController发送电子邮件的类,这样我就可以在我的应用程序中使用差异视图控件中的这些方法。
这个类叫做apoio。
在这个课程中有以下方法。
-(void) enviarGraficoPorEmail: (NSData*) _pdfGrafico {
if (![MFMailComposeViewController canSendMail]) {
// show message box for user that SMS cannot be sent
} else {
MFMailComposeViewController *picker = [[MFMailComposeViewController alloc] init];
picker.mailComposeDelegate = self;
[picker setSubject:@"Dashboard"];
[picker addAttachmentData:_pdfGrafico mimeType:@"application/pdf" fileName:@"grafico.pdf"];
NSString *emailBody = @"Anexando gráfico";
[picker setMessageBody:emailBody isHTML:NO];
[self presentModalViewController:picker animated:YES];
}
}
我有另一个视图控制器在用户点击电子邮件按钮时调用apoio方法。这是下面的代码
-(IBAction) enviarGraficoPorEmail {
Apoio *apoio = [[Apoio alloc] init];
[apoio enviarGraficoPorEmail:[barChart dataForPDFRepresentationOfLayer]];
}
但我不知道原因,电子邮件视图没有出现。这个方法被称为正确的,因为我调试了等等。
如果我将代码从apoio方法复制到enviarGraficoPorEmail方法,一切都很完美。
但是我不想这样做,因为发送来自别人视图控制器的电子邮件。
我做错了什么?
答案 0 :(得分:1)
你可以通过几种不同的方式做到这一点。
选项1:将调用视图控制器作为参数传递给类方法
-(IBAction) enviarGraficoPorEmail {
Apoio *apoio = [[Apoio alloc] init];
[apoio enviarGraficoPorEmail:[barChart dataForPDFRepresentationOfLayer] callingController:self];
}
-(void) enviarGraficoPorEmail: (NSData*) _pdfGrafico callingController:(UIViewController*)_callingController {
...
[_callingController presentModalViewController:picker animated:YES];
...
}
选项2:为调用视图控制器添加类变量
-(IBAction) enviarGraficoPorEmail {
Apoio *apoio = [[Apoio alloc] init];
apoio.callingController = self;
[apoio enviarGraficoPorEmail:[barChart dataForPDFRepresentationOfLayer]];
}
-(void) enviarGraficoPorEmail: (NSData*) _pdfGrafico callingController:(UIViewController*)_callingController {
...
[callingController presentModalViewController:picker animated:YES];
...
}
然后你将callingController作为retain属性添加到你的类中,将其初始化为nil,并在dealloc中释放它。
选项#1可能是满足您需求的更好方法。
答案 1 :(得分:1)
非常感谢!它现在正在工作,但我仍有一个问题。
我的泛型类上的方法应该负责隐藏mailController。
- (void)mailComposeController:(MFMailComposeViewController*)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError*)error
{
switch (result)
{
case MFMailComposeResultCancelled:
break;
case MFMailComposeResultSaved:
break;
case MFMailComposeResultSent:
// FAILS
[self.parentViewController dismissModalViewControllerAnimated:YES];
break;
case MFMailComposeResultFailed:
break;
default:
break;
}
[self dismissModalViewControllerAnimated:YES];
}
在创建mailController的方法中有属性
picker.mailComposeDelegate = self;
我试图改为
picker.mailComposeDelegate = _callingController.self;
我已经在我的泛型类上设置了MFMailComposeViewControllerDelegate。
但它只有在我复制方法didFinishWithResult并将其放在原始控制器上时才有效,这不是我的意图,因为我想将所有这些代码放在泛型类上。
我做错了什么?
答案 2 :(得分:1)
好的,这是您第二个问题的答案(您在第一个问题的答案中发布)。
以下是我如何设置的全部内容:
在您的呼叫视图控制器.h文件中:
@interface MyViewController : UIViewController <MyMailDelegate> {
Apoio *apoio;
}
在您的主叫视图控制器.m文件中:
-(IBAction) enviarGraficoPorEmail {
apoio = [[Apoio alloc] init];
apoio.callingController = self;
[apoio enviarGraficoPorEmail:[barChart dataForPDFRepresentationOfLayer]];
}
-(void) enviarCompleto {
//do whatever here after send email completes
[apoio release];
}
在你的Apoio .h文件中
@protocol MyMailDelegate
@required
-(void) enviarCompleto;
@end
@interface OfferObject : NSObject {
UIViewController <MyMailDelegate> *callingController;
}
@property (nonatomic, retain) UIViewController <MyMailDelegate> *callingController;
在你的Apoio .m文件中
-(void) enviarGraficoPorEmail: (NSData*) _pdfGrafico callingController:(UIViewController*)_callingController {
...
[callingController presentModalViewController:picker animated:YES];
...
}
-(void)mailComposeController:(MFMailComposeViewController*)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError*)error
{
switch (result)
{
...
}
[callingController dismissModalViewControllerAnimated:YES];
[callingController enviarCompleto];
}
然后不要忘记在init上执行此操作:
callingController = nil;
关于dealloc:
[callingController release];
另外,不要忘记你最重要的一步:向我的答案投票:)
答案 3 :(得分:0)
你需要调用[self presentModalViewController:picker animated:YES];
从UIViewController类开始,它会显示你的电子邮件编辑器,你可以这样做,每当你从某个视图控制器调用时你可以传递它的引用,你就可以改变上面这行
[callingController presentModalViewController:picker animated:YES];