从另一个类(MFMailComposeViewController)呈现模态视图

时间:2012-04-25 20:53:40

标签: iphone ios

我正在尝试创建一个负责使用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方法,一切都很完美。

但是我不想这样做,因为发送来自别人视图控制器的电子邮件。

我做错了什么?

4 个答案:

答案 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];