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 メソッドから envarGraficoPorEmail メソッドにコピーすると、すべてが完璧に機能します。

しかし、私はこれをやりたくない.

私は何を間違っていますか??

4

4 に答える 4

1

あなたはそれをいくつかの異なる方法で行うことができます。

オプション1:呼び出し元のViewControllerをパラメーターとしてクラスメソッドに渡します

-(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:呼び出し元のViewControllerのクラス変数を追加します

-(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

どうもありがとう!。現在は機能していますが、まだ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

わかりました、これは 2 番目の質問 (最初の質問への回答として投稿したもの) に対する回答です。

すべてを設定する方法は次のとおりです。

呼び出し元のビュー コントローラー .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 animation:YES]; を呼び出す必要があります。
UIViewController クラスからメール コンポーザーが表示されます。これを行うことができます。ビュー コントローラーから呼び出すたびに、その参照を渡すことができ、上記の行を次のように変更できます。

[callingController presentModalViewController:picker アニメーション:YES];

于 2012-04-25T21:11:06.387 に答える