2010-11-25 5 views
2

J'ai un modalViewController avec un bouton appelé email. En appuyant sur ce bouton, il présente le MFMailComposeViewController modalement. Tout fonctionne bien quand j'envoie l'email. Mais lorsque l'utilisateur appuie sur le bouton Annuler de la vue MFMail, l'application raccroche et n'affiche pas la feuille d'action. Il ne montre aucun détail dans la console etc., apparemment le délégué MFMailCompose n'est pas appelé dans ce cas.Comment présenter un MFMailComposeViewController dans un modalViewController déjà existant?

J'ai vérifié en utilisant le même code dans un autre contrôleur de vue (qui n'était pas un modalviewcontroller) et j'ai trouvé que tout fonctionnait parfaitement. Par conséquent, je suppose que le problème est de présenter le MFMailComposeViewController dans un contrôleur qui est déjà un modalviewcontroller. J'ai cherché de l'aide depuis un certain temps et j'en suis arrivé à la conclusion que MFMailComposeViewController étant lui-même un modalviewcontroller, il ne peut donc être utilisé que sur un simple contrôleur de vue, et ne fonctionnerait pas dans un modalviewcontroller.

Quelqu'un peut-il me guider sur l'utilisation de MFMailComposer dans un contrôleur modalview? Toute aide serait très appréciée.

Mon code:

-(IBAction)emailButtonPressed:(id)sender{ 

      Class mailClass = (NSClassFromString(@"MFMailComposeViewController")); 
     if (mailClass != nil) 
      { 

      if ([mailClass canSendMail]) 
      { 
       [self displayComposerSheet]; 
      } 
      else 
      { 
       [self launchMailAppOnDevice]; 
      } 
      } 
     else 
      { 
      [self launchMailAppOnDevice]; 
      } 


} 


#pragma mark - 
#pragma mark Compose Mail 


-(void)displayComposerSheet 
{ 
    MFMailComposeViewController *picker = [[MFMailComposeViewController alloc] init]; 
    picker.mailComposeDelegate = self; 

    [picker setSubject:@"Ilusiones"]; 


    // Set up recipients 
    NSArray *toRecipients = [NSArray arrayWithObject:@"[email protected]"]; 

    [picker setToRecipients:toRecipients]; 
    // Attach a screenshot to the email  
    UIGraphicsBeginImageContext(self.view.bounds.size); 
    [self.view.layer renderInContext:UIGraphicsGetCurrentContext()]; 
    UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

     NSData *myData = UIImagePNGRepresentation(viewImage); 
    [picker addAttachmentData:myData mimeType:@"image/png" fileName:@"viewImage"]; 



    // Fill out the email body text 
    NSString *emailBody = @""; 
    [picker setMessageBody:emailBody isHTML:NO]; 

    [self presentModalViewController:picker animated:YES]; 
     [picker release]; 

} 



- (void)mailComposeController:(MFMailComposeViewController*)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError*)error 
{ 
    NSLog (@"entered the delegate"); // this line is not shown when the cancel button is tapped-meaning it never enters the delegate in that case. 
    switch (result) 
    { 
case MFMailComposeResultCancelled: 
    NSLog(@"Result: canceled"); 
    break; 
case MFMailComposeResultSaved: 
    NSLog(@"Result: saved"); 
    break; 
case MFMailComposeResultSent: 
    NSLog(@"Result: sent"); 
    break; 
case MFMailComposeResultFailed: 
    NSLog(@"Result: failed"); 
    break; 
default: 
    NSLog(@"Result: not sent"); 
    break; 
} 
[self dismissModalViewControllerAnimated:YES]; //this works fine in the send case, and the email is sent. but hangs in the cancel case. 
} 


#pragma mark - 
#pragma mark Workaround 


-(void)launchMailAppOnDevice 
{ 
NSString *recipients = @"mailto:[email protected][email protected],[email protected]&subject=illusions!"; 
NSString *body = @"&body=xyz"; 

NSString *email = [NSString stringWithFormat:@"%@%@", recipients, body]; 
email = [email stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; 

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:email]]; 
} 

Répondre

Questions connexes