Search code examples
iphoneobjective-cxcodemfmailcomposer

dismissModalViewControllerAnimated produces black background


My app is to create csv file and send it through mail. But when I discard mail, I'm getting black screen. The previous view is not appearing and is being covered by the black screen. I viewed various questions and answers in stack overflow. But nothing seems to be working.

- (IBAction)openMail:(id)sender
{
    [self getdata];

    if ([MFMailComposeViewController canSendMail])
    {
        MFMailComposeViewController *mailer = [[MFMailComposeViewController alloc] init];
        mailer.mailComposeDelegate = self;
        [mailer setSubject:@"BMNET- Travel Log"];




        NSString *CSVstring=@"Name, StartingDateNTime, EndingDateNTime, TravelType, DistanceTravelled, Amount\n" ;

        NSString *CSVPath,*record;;

        NSString  *temporayCSV= @"" ;

           for (int i=0; i<[getAmount count]; i++) {    

               record = [NSString stringWithFormat:@"%@, %@, %@, %@, %@, %@", [getName objectAtIndex:i],   [getStartDate objectAtIndex:i],   [getEndDate objectAtIndex:i],[getType objectAtIndex:i],[getDistance objectAtIndex:i],[getAmount objectAtIndex:i]];



                      NSLog(@"%d",i);

                      temporayCSV = [NSString stringWithFormat:@"%d  %@  \n ",(i+1),record];

                      CSVstring = [CSVstring stringByAppendingFormat:temporayCSV];       
                      NSLog(@"%@",CSVstring);

          }

        NSArray *paths = NSSearchPathForDirectoriesInDomains(
                                                             NSDocumentDirectory, NSUserDomainMask, YES); 
        NSString *documentsDirectory = [paths objectAtIndex:0]; 

        NSArray *toRecipients = [NSArray arrayWithObjects:@"", nil];
        [mailer setToRecipients:toRecipients];
        CSVPath = [documentsDirectory stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.csv", @"CSV_FormatedTable"]];
        NSFileManager *fileManager;
        //add our file to the path
        [fileManager createFileAtPath:CSVPath contents:[CSVstring dataUsingEncoding:NSUTF8StringEncoding] attributes:nil];
        NSData *rolesCSVData =[NSData dataWithContentsOfFile:CSVPath];
        NSLog(@"The data is %@",CSVstring);

        //create my data to append
        NSFileHandle *handle;
        handle = [NSFileHandle fileHandleForWritingAtPath: CSVPath ]; 
        //say to handle where's the file fo write
        [handle truncateFileAtOffset:[handle seekToEndOfFile]]; 
        //position handle cursor to the end of file
        [handle writeData:[data dataUsingEncoding:NSUTF8StringEncoding]];   
        //write data to with the right encoding






        [mailer addAttachmentData:rolesCSVData mimeType:@"text/csv" fileName:@"Log"];
        NSString *emailBody = @"Attachment of Log";
        [mailer setMessageBody:emailBody isHTML:NO];
        [self presentModalViewController:mailer animated:YES];
        mailer.modalPresentationStyle = UIModalPresentationPageSheet;

    }
    else
    {
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Failure"
                                                        message:@"Your device doesn't support the composer sheet"
                                                       delegate:nil
                                              cancelButtonTitle:@"OK"
                                              otherButtonTitles:nil];
        [alert show];
    }
}

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

        case MFMailComposeResultCancelled:
            NSLog(@"Mail cancelled: you cancelled the operation and no email message was queued.");

            break;
        case MFMailComposeResultSaved:
            NSLog(@"Mail saved: you saved the email message in the drafts folder.");

            break;
        case MFMailComposeResultSent:
            NSLog(@"Mail send: the email message is queued in the outbox. It is ready to send.");

            break;
        case MFMailComposeResultFailed:
            NSLog(@"Mail failed: the email message was not saved or queued, possibly due to an error.");

            break;
        default:
            NSLog(@"Mail not sent.");

            break;
    }
    // Remove the mail view

    [self dismissModalViewControllerAnimated:YES];

}

Solution

  • presentModalViewController:animated: and dismissModalViewControllerAnimated: are deprecated as of iOS6, just as a side note! which iOS versions are you targeting for and is this a iPhone or iPad application you're working on?

    beside that i noticed the following:

    [self presentModalViewController:mailer animated:YES];
    mailer.modalPresentationStyle = UIModalPresentationPageSheet;
    

    you're setting the modalPresentationStyle after you've presented the view controller! move the line mailer.modalPresentationStyle = UIModalPresentationPageSheet; before the presentModalViewController line. Maybe this is the problem!