2012-04-25 9 views
1

MFMailComposeViewControllerを使用して電子メールを送信するクラスを作成しようとしています。別のクラス(MFMailComposeViewController)からモーダルビューを提示する

このクラスはアポイオと呼ばれます。

このクラスでは、以下の方法があります。

-(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];   
     } 
} 

ユーザーが電子メールボタンをクリックしたときにアポイオメソッドを呼び出す別のビューコントローラがあります。このコードは以下のとおりです

-(IBAction) enviarGraficoPorEmail { 

Apoio *apoio = [[Apoio alloc] init]; 
[apoio enviarGraficoPorEmail:[barChart dataForPDFRepresentationOfLayer]]; 
} 

しかし、私は電子メールの表示が表示されない理由はわかりません。私はデバッグしたので、このメソッドは正しいと呼ばれます。

私はapoioメソッドからenviarGraficoPorEmailメソッドにコードをコピーすると、すべてが完璧に動作します。

しかし、私はこれをやりたいとは思わない、beucase病気は、他のビューのコントローラから電子メールを送信します。

何が間違っていますか?

答えて

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はおそらくあなたのニーズに適したアプローチです。

0

[self presentModalViewController:picker animated:YES]を呼び出す必要があります。 UIViewControllerクラスから
それは[callingController presentModalViewControllerあなたには、いくつかのビューコントローラから呼び出すたびに、その参照を渡すことができますし、この

として上記の行を変更することができ、あなたがこれを行うことができ、あなたの電子メールの作曲を表示します。ピッカーアニメーション:はい];

+0

Hummm ...しかし問題は、そのメソッドを汎用的にしたいので、私は呼び出すことができますそれは他のコントローラから見ることができます。 callControlerの名前を動的に取得する方法を知っていますか? –

+1

genericメソッドを呼び出す際にselfをパラメータとして渡すだけで、selfは現在のUIViewControllerインスタンスを参照します – Muddsar

+0

Thnaks muddsar! –

1

ありがとうございます!それは今働いているが、私はまだ1つの問題がある。

私は、私のジェネリッククラスの誰かがmailControllerを隠すことになっているはずのメソッドを持っています。 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]; 
} 

プロパティ

picker.mailComposeDelegate = self; 

を持っている私は、私はすでに私のジェネリッククラスにMFMailComposeViewControllerDelegateを設定

picker.mailComposeDelegate = _callingController.self; 

に変更しようとしました。

しかし、このメソッドはdidFinishWithResultメソッドをコピーして元のコントローラに置いたときにのみ動作します。このコードをジェネリッククラスに入れたいからです。

何が間違っていますか?

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

また、忘れてはいけませんあなたの最も重要なステップ:私の答えを両方とも投票してください:)

+0

unfortuelyそれはまだ動作していません:(。問題は、メソッド - (void)mailComposeController :(MFMailComposeViewController *)コントローラdidFi .....が電子メールコンポーザのデリゲートから自動的に呼び出されます。ボタンの送信またはキャンセルが押されています。これにはどうすれば対応できますか?これは問題です。アポエオクラスでは、このメソッドにブレークポイントを設定しても呼び出されません。メソッドが呼び出されました。あなたの忍耐のために本当にありがとうございます。私は投票しようとしましたが、投票するには15ポイントが必要です –

+0

メソッド - (void)mailComposeController:(MFMailComposeViewController *)コントローラーdidFinishWithResult:(MFMailComposeResult)result error :(NSError *)エラーは、MFMailComposeViewControllerのプロトコルです。私が呼び出すメソッドではありません.MFMailComposeViewControllerから自動的に呼び出されます。 –

+0

picker.mailComposeDelega te = selfは、クラスapoioがデリゲートコールバックメソッドを受け取るようにデリゲートを設定する必要があります。デリゲートを元の呼び出し元にしたい場合は、picker.mailComposeDelegate = callingControllerを実行します。しかし、私が提供したプロトコルパターンでは、クラスにデリゲートを持たせることができ、enviarCompletoを使って呼び出し元にコールバックします。 enviarCompletoにパラメータを追加して、必要に応じて結果を戻すこともできます。 – Joel

関連する問題