【问题标题】:MFMailComposeViewController : gives EXC-BAD-EXCESS when dismiss it from parent viewMFMailComposeViewController : 当从父视图中关闭它时给出 EXC-BAD-EXCESS
【发布时间】:2012-04-16 03:12:51
【问题描述】:

我有 UINavigationController/UITabBarController 基础应用程序,一切正常,但 MFMailComposeViewController 让我发疯。我几乎浏览了所有关于 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];
}

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

更多代码..这里我提供代码...

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

谢谢。

【问题讨论】:

  • [controller dismissModalViewControllerAnimated:YES]; 应该可以工作
  • 请提供更多代码详情。
  • @beryllium :我用过。但它不起作用...谢谢..
  • @Priyanka:在帖子中查看我的编辑...我添加了更多代码。
  • @Nit 替换这一行 [[self parentViewController] presentModalViewController:mail1 animated:YES]; by [self presentModalViewController:mail1 animated:YES];

标签: iphone ios xcode mfmailcomposeviewcontroller dismiss


【解决方案1】:

我最近为我的项目做了这个,它运行良好。我不确定您的代码有什么问题,但是如果您想比较,这是我的代码。如果您需要更多帮助,请发表评论。

- (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:@"Youremail@email.com", 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];
}

【讨论】:

    【解决方案2】:

    这是我实现该方法的工作代码。 请注意,我将您的方法与我的方法进行了比较。它们看起来很相似。 您可能还希望在构建和实例化之前尝试清理您的项目 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];
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多