Iphone 从另一个类(MFMailComposeViewController)显示模式视图
我正在尝试创建一个类,该类将负责使用MFMailComposeViewController发送电子邮件,以便我可以从我的应用程序中的差异视图控件使用此方法 这个类叫做apoio 在这个类中有下面的方法Iphone 从另一个类(MFMailComposeViewController)显示模式视图,iphone,ios,Iphone,Ios,我正在尝试创建一个类,该类将负责使用MFMailComposeViewController发送电子邮件,以便我可以从我的应用程序中的差异视图控件使用此方法 这个类叫做apoio 在这个类中有下面的方法 -(void) enviarGraficoPorEmail: (NSData*) _pdfGrafico { if (![MFMailComposeViewController canSendMail]) { // show message box for user that SMS c
-(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]];
}
但我不知道为什么,电子邮件视图没有出现。该方法被调用为correct,因为我进行了调试等等
如果我将代码从apoio方法复制到enviragraficoporemail方法,那么一切都会很完美
但我不想这样做,因为我会从其他人那里发送电子邮件
我做错了什么???您需要调用[self-presentModalViewController:picker animated:YES]
从UIViewController类中,它将向您显示电子邮件生成器,您可以这样做,无论何时从某个视图控制器调用,您都可以传递其引用,并且您可以将上面的行更改为
[调用控制器presentModalViewController:picker动画:是] 你可以用几种不同的方法来做 选项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可能是满足您需求的更好方法 非常感谢!。它现在正在工作,但我仍然有一个问题 我的泛型类上有一个方法,该方法负责隐藏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方法并将其放在origin控制器上时起作用,这不是我的意图,因为我想将所有这些代码放在一个泛型类上
我做错了什么?好的,这是对你第二个问题的回答(你把它作为对第一个问题的回答发布了出来) 以下是我将如何设置这一切: 在调用视图控制器.h文件中:
@interface MyViewController : UIViewController <MyMailDelegate> {
Apoio *apoio;
}
在Apoio.h文件中
@protocol MyMailDelegate
@required
-(void) enviarCompleto;
@end
@interface OfferObject : NSObject {
UIViewController <MyMailDelegate> *callingController;
}
@property (nonatomic, retain) UIViewController <MyMailDelegate> *callingController;
然后不要忘记在init上执行此操作:
callingController = nil;
关于dealloc:
[callingController release];
还有,别忘了你最重要的一步:向上投票给我的两个答案:)嗯。。。但问题是,我希望使该方法通用,以便可以从其他视图控制器调用它。您知道如何动态获取CallingController的名称吗?您只需要在调用泛型方法时将self作为参数传递,self引用您当前的UIViewController实例,不幸的是它仍然不工作:(.问题是方法-(void)mailComposeController:(MFMailComposeViewController*)控制器didFi…..由电子邮件编写器的委托自动调用。当按下“发送”或“取消”按钮时,会调用此方法。我如何对此作出响应?这就是问题所在。在apoio类中,我在该方法上放置了一个断点,但它从未被调用。但如果我将此方法放置在源类上,则该方法为called。非常感谢Joel的耐心。顺便说一句,我试着投赞成票,但我需要15分才能被允许投票。方法-(void)mailComposeController:(MFMailComposeViewController*)控制器未完成结果:(MFMailComposeResult)结果错误:(N错误*)错误是来自MFMailComposeViewController的协议。它不是我调用的方法。它是从MFMAILCOMPOSEVIEWCONTROLLEPICKER.mailComposeDelegate=self自动调用的。应设置委托,以便类apoio接收委托回调方法。如果希望委托是原始调用方,请执行picker.mailComposeDelegate=callingController。但是我提供的协议模式允许您在类上拥有委托,它将使用enviarCompleto为您回调调用方。如果需要,您可以向enviarCompleto添加一个参数以将结果传回。
callingController = nil;
[callingController release];