2012-01-14 19 views
2

MFMailComposeViewControllerを使用してアプリケーションでメールを送信します。しかし、現在のメールがView Controllerを構成しているときは、ナビゲーションボタンはすべて無効になっています(選択したメールアドレス画面の戻るボタンを除く)、私はホームボタンを使用してアプリケーションを終了する必要があります。誰にもアイデアはありますか?ここで はスクリーンショットです: Screen shot 2MFMailComposeViewControllerナビゲーションバーのボタンが無効にされています


コード:

 
- (void)shareVieEmail 
{ 
    if ([MFMailComposeViewController canSendMail]) { 
     MFMailComposeViewController *mailViewController = [[MFMailComposeViewController alloc] init]; 
     mailViewController.mailComposeDelegate = self; 
     [mailViewController setSubject:@"Test subject"]; 
     [mailViewController setMessageBody:@"Mail message body" isHTML:NO]; 

     NSData *imageData = [NSData dataWithContentsOfFile:photourl]; 
     [mailViewController addAttachmentData:imageData mimeType:@"image/jpg" fileName:@"example_photo"]; 
     [self presentModalViewController:mailViewController animated:YES]; 
    } else { 
     [[[UIAlertView alloc] initWithTitle:@"Cannot send mail" message:@"Device is unable to send email in its current state" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil] show]; 
    } 
} 

デリゲートメソッド:

 
- (void)mailComposeController:(MFMailComposeViewController *)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError *)error 
{ 
    switch (result) 
    { 
     case MFMailComposeResultCancelled: 
      //NSLog(@"Result: canceled"); 
      break; 
     case MFMailComposeResultSaved: 
      //NSLog(@"Result: saved"); 
      break; 
     case MFMailComposeResultSent: 
     { 
      UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Result" message:@"Mail Sent Successfully" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil, nil]; 
      [alert show]; 
     } 
      break; 
     case MFMailComposeResultFailed: 
     { 
      UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Result" message:@"Mail Sent Failed" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil, nil]; 
      [alert show]; 
     } 
      break; 
     default: 
      //NSLog(@"Result: not sent"); 
      break; 
    } 
    if (error) { 
     [[[UIAlertView alloc] initWithTitle:@"Cannot send mail" message:[NSString stringWithFormat:@"ERROR:%@", [error userInfo]] delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil] show]; 
    } 
    [self dismissModalViewControllerAnimated:YES]; 
} 

とヘッダファイルで、私はMFMailComposを実装すると宣言しましたeViewControllerDelegate。

+0

コントローラーの表示に使用するコードを表示できますか? – mvds

+0

@mvds私のコードを掲載しました。 – youshunei

+0

奇妙な、それは上品に見えます。あなたの電子メール設定と関係がありますか?すべてのデバイスでこのように見えますか? – mvds

答えて

2

私は正確に同じ問題を抱えていました。それがこれを理解するために私にしばらく時間がかかったが、何の驚きは、それは私が賭けダウン、カスタマイズUIBarButtonItem

に来なかったあなたのUIBarButtonItem.hそこ方法

-(void)setEnabled:(BOOL)enabled ; 

であり、実装は次のようになります。

-(void)setEnabled:(BOOL)enabled { 
    if (self.customView) { 
     if ([[self.customView.subviews objectAtIndex:0] isKindOfClass:[UIButton class]])   { 
      ((UIButton*)[self.customView.subviews objectAtIndex:0]).enabled = enabled; 
     } 
    } 
} 

これは問題を引き起こしています。この方法をコメントアウトするとすぐに問題は解決されます。

+0

うん! ^^。あなたよ!、ありがとう!私はこのメソッドを書き直します。この問題は解決しました。 – youshunei

-1

MFMailComposeViewControllerのデリゲートでdidFinishWithResult:を実装し、そこからモーダルビューコントローラを閉じる必要があります。

- (void)mailComposeController:(MFMailComposeViewController*)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError*)error 
{ 
    // you can test the result of the mail sending here if you want 

    [self dismissModalViewControllerAnimated:YES]; 
} 
+0

didFinishWithResultデリゲートメソッドを実装しました。 – youshunei

0

また、私はこの問題を抱えていたが、CNContactViewControllerのバグのため、このworkaroundに提案されているように、私はUINavigationControllerからsetNavigationBarHidden:animated:をオーバーライドしていたので、それは私の場合それはでした。回避策をまだ含み、MFMailComposeViewControllerの問題を解決する1つの解決策は、現在のtopViewControllerのクラスに応じて、元のメソッドまたはオーバーライドされたメソッドを呼び出すことができるメソッドスウィズルを使用することです。

関連する問題