MFMailComposeViewController:从父视图中关闭EXC-BAD-EXCESS时

问题描述:

我有UINavigationController/UITabBarController基本应用程序,所有工作正常,但MFMailComposeViewController让我发疯。我经历了几乎所有关于MFMailComposeViewController的堆栈溢出问题,并且尝试了它,但是当它试图从父视图中解雇它时,它给了我EXC-BAD-EXCESS。MFMailComposeViewController:从父视图中关闭EXC-BAD-EXCESS时

这是我用于MFMailComposeViewController的代码。

- (void)mailComposeController:(MFMailComposeViewController*)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError*)error 
{  

UIAlertView *alert; 
if (result == MFMailComposeResultFailed) { 
    alert = [[UIAlertView alloc] initWithTitle:@"Message Failed!" message:@"Your email has failed to send" delegate:self cancelButtonTitle:@"Dismiss" otherButtonTitles:nil]; 

    [alert show]; 
    [alert release]; 
} 

[self dismissModalViewControllerAnimated:YES]; 
//[controller dismissModalViewControllerAnimated:YES]; 
//[[self parentViewController]dismissModalViewControllerAnimated:YES]; 
} 

我不知道我的错误在哪里,或者这个邮件编辑器有什么问题。请提供一些指导。

更多code..here我是个提供代码...

-(void)mailsender 
{ 
    NSUserDefaults *invoiceautogenerator = [NSUserDefaults standardUserDefaults]; 
NSString *invoicestring = [invoiceautogenerator objectForKey:@"invoice"]; 

NSString *MemoString = [[NSUserDefaults standardUserDefaults]valueForKey:@"SALEMEMODETAIL"]; 
NSString *PassUniqeNumer = [[NSUserDefaults standardUserDefaults]valueForKey:@"UNIQUREFKEYDATA"]; 

MFMailComposeViewController *mail1 = [[[MFMailComposeViewController alloc] init]autorelease]; 

mail1.mailComposeDelegate = self; 


[self databaseOpen]; 
NSString *str = [NSString stringWithFormat:@"Select EmailID from tblMercuryDetail"]; 
NSLog(@"str:%@",str); 
NSArray *Query = [[NSArray alloc]init]; 
Query = [database executeQuery:str]; 
NSLog(@"Array DataL%@",Query); 

NSString *Emailid = [NSString stringWithFormat:@"%@",[Query valueForKey:@"EmailID"]] ; 
NSLog(@"Emailid:%@",Emailid); 

Emailid = [Emailid stringByReplacingOccurrencesOfString:@"(" withString:@""]; 
Emailid = [Emailid stringByReplacingOccurrencesOfString:@")" withString:@""]; 
Emailid = [Emailid stringByReplacingOccurrencesOfString:@"\"" withString:@""]; 
Emailid = [Emailid stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; 
NSLog(@"Emailid:%@",Emailid); 
[Query release]; 
[database close]; 



UIImage *savedimage = [self loadImage:invoicestring]; 

NSData *myData = UIImagePNGRepresentation(savedimage); 

[mail1 addAttachmentData:myData mimeType:@"image/png" fileName:@"sign.png"]; 

if ([MFMailComposeViewController canSendMail]) { 
    //Setting up the Subject, recipients, and message body. 
    [mail1 setToRecipients:[NSArray arrayWithObjects:Emailid,nil]]; 
    [mail1 setSubject:@"Receipt"]; 
    [mail1 setMessageBody:@"Message of email" isHTML:NO]; 
    NSString *emailBody; 

    [self databaseOpen]; 

    NSString *str = [NSString stringWithFormat:@"Select * from tblGiftTransaction where InvoiceNo = '%@' ",invoicestring]; 

    NSArray *Arraydata = [[NSArray alloc]init]; 
    Arraydata = [database executeQuery:str]; 

    NSString *PurchaseAmt = [NSString stringWithFormat:@"%@",[Arraydata valueForKey:@"PurchaseAmt"]]; 
    NSString *TransactionType = [NSString stringWithFormat:@"%@",[Arraydata valueForKey:@"TransactionType"]]; 

    NSLog(@"==%@",Arraydata); 


       emailBody = [NSString stringWithFormat:@ 
          "<br>Memo:     </br> " "%@" 
          "<br>Ref Number:   </br> ""%@" 
          "<br>Invoice No:   </br> ""%@" 
          "<br>Purchase Amount:  </br> ""$%@" 
          "<br>Transaction Type:  </br> ""%@" 
          ,MemoString,PassUniqeNumer,invoicestring,PurchaseAmt,TransactionType 
          ]; 

    NSLog(@"%@",emailBody); 

      [mail1 setMessageBody:emailBody isHTML:YES]; 
    [[self parentViewController] presentModalViewController:mail1 animated:YES]; 
    [database close]; 


     } 

    //[mail release]; 
} 

感谢。

+0

''[controller dismissModalViewControllerAnimated:YES];'应该工作 – beryllium 2012-04-02 13:08:22

+0

请提供更多的代码细节。 – priyanka 2012-04-02 13:09:41

+0

@beryllium:我用过它。但它不工作......谢谢.. – Nit 2012-04-02 13:10:17

我最近为我的项目做了这个,它工作正常。我不是%100肯定你的代码有什么问题,但是这里是我的代码,如果你想比较。请评论,如果你需要更多的帮助。

- (IBAction)EmailMe:(id)sender 
{ 
    //Open MFMail and set Preferences 

    UIGraphicsBeginImageContext(self.view.frame.size); 
    [self.view.layer renderInContext:UIGraphicsGetCurrentContext()]; 
    UIImage * image = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    MFMailComposeViewController *mailComposer = [[MFMailComposeViewController alloc] init]; 
    [mailComposer setMailComposeDelegate:self]; 
    NSData *imageData = UIImageJPEGRepresentation(image,1.0); 
    if([MFMailComposeViewController canSendMail]){ 
     [mailComposer setToRecipients:[NSArray arrayWithObjects:@"[email protected]", nil]]; 
     [mailComposer setSubject: @"Subject"]; 
     [mailComposer setMessageBody:@"Hello, \n\n how are you?" isHTML:NO]; 
//if you want to attach an image 


[mailComposer addAttachmentData:imageData mimeType:@"image/jpeg" fileName:@"attachment.jpg"]; 
     [mailComposer setModalTransitionStyle:UIModalTransitionStyleCrossDissolve]; 



     [self presentModalViewController:mailComposer animated:YES]; 
    } 

} 

//Dismiss MFmail 
-(void)mailComposeController:(MFMailComposeViewController*)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError *)error 
{ 
    if(error) 
    { 
     UIAlertView *alert= [[UIAlertView alloc] 
          initWithTitle:@"Error %@" 
          message:[NSString stringWithFormat:@"Error %@", [error description]] 
          delegate:self 
          cancelButtonTitle:@"Dismiss" 
          otherButtonTitles:nil]; 
     [alert show]; 

    } 

    [self dismissModalViewControllerAnimated:YES]; 
} 
+0

这是工作的人...谢谢..我一定会加上+5 ..... – Nit 2012-04-03 07:49:40

+0

感谢蕾,并且很乐意帮助 – 2012-04-03 14:04:49

这是我的工作代码来实现该方法。请注意,我将你的方法与我的方法进行了比较。它们看起来很相似。 您也可能希望在if语句之前构建并实例化整个警报对象之前,尝试清理您的项目。

- (void)mailComposeController:(MFMailComposeViewController*)controller 
didFinishWithResult:(MFMailComposeResult)result error:(NSError*)error 
{ 
switch (result) 
{ 
    case MFMailComposeResultCancelled: 
     emailMsg = @"email canceled"; 
     break; 
    case MFMailComposeResultSaved: 
     emailMsg = @"email saved"; 
     break; 
    case MFMailComposeResultSent: 
     emailMsg = @"email sent"; 
     break; 
    case MFMailComposeResultFailed: 
     emailMsg = @"email failed"; 
     break; 
    default: 
     emailMsg = @"email not sent"; 
     break; 
} 

NSString *msgResult; 
msgResult = emailMsg; 
NSLog(@"msgResult %@", msgResult); 
UIAlertView *avMsgResult = [[UIAlertView alloc] initWithTitle:@"Mail Status" 
message:msgResult delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil]; 
[avMsgResult show]; 
[avMsgResult release]; 


[self dismissModalViewControllerAnimated:YES]; 
} 
+0

它不工作...我已经尝试过了....但是谢谢你的回复... – Nit 2012-04-02 13:19:31