1

我正在尝试创建一个负责使用 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

4 回答 4

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 可能是满足您需求的更好方法。

于 2012-04-26T00:06:26.493 回答
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 并将其放在源控制器上时才有效,这不是我的意图,因为我想将所有这些代码放在通用类上。

我究竟做错了什么 ??

于 2012-04-26T13:33:30.483 回答
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];

另外,不要忘记您最重要的一步:对我的两个答案都投赞成票:)

于 2012-04-26T19:30:17.837 回答
0

你需要调用 [self presentModalViewController:picker animated:YES];
从 UIViewController 类,然后它会向您显示电子邮件编写器,您可以这样做,每当您从某个视图控制器调用时,您都可以传递它的引用,您可以将上面的行更改为

[callingController presentModalViewController:picker animated:YES];

于 2012-04-25T21:11:06.387 回答