MFMailComposeViewController: выдает EXC-BAD-EXCESS при отклонении его от родительского представления - PullRequest
0 голосов
/ 02 апреля 2012

У меня есть базовое приложение 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];
 }

Спасибо.

Ответы [ 2 ]

1 голос
/ 02 апреля 2012

Я недавно сделал это для своего проекта, и он работает нормально.Я не уверен на 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:@"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];
}
0 голосов
/ 02 апреля 2012

Вот мой рабочий код для реализации метода.Обратите внимание, что я сравнил ваш метод с моим.Они кажутся похожими.Вы также можете попробовать очистить свой проект перед созданием и созданием экземпляра всего объекта оповещения перед оператором 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];
}
...