2010-11-25 2 views
4

J'essaie d'incorporer MFMailComposeViewController dans mon application. Lorsque je le présente de manière modale, le bouton d'envoi fonctionne correctement et l'e-mail est envoyé, ce qui implique que le résultat envoyé au délégué est correct dans ce cas. Alors que lorsque j'appuie sur le bouton Annuler, l'application est suspendue. Le journal ne montre aucune erreur non plus, juste l'écran s'assombrit et tout est désactivé. Apparemment, le résultat n'est pas transmis au délégué (je l'ai vérifié dans les journaux). il apparaît que leLa feuille d'action ne s'affiche pas lorsque le bouton d'annulation de MFMailComposeViewController est tapé

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

n'est jamais appelé à chaque pression sur le bouton d'annulation. Probablement c'est la raison pour laquelle la feuille d'action (Enregistrer le brouillon, annuler, supprimer le brouillon) n'est pas affiché et donc l'application se bloque juste là. J'utilise le code exact des exemples d'applications d'Apple (MailComposer), il fonctionne parfaitement là, mais échoue en quelque sorte dans le mien. :(

bien vouloir me aider si quelqu'un a jamais rencontré le même problème, et avec succès résolu il

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 
{ 

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


#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

0

J'ai mis en œuvre le même code Il fonctionne tout à fait bien. lorsque vous cliquez sur le bouton projet de suppression, la méthode didFinishWithResult est appelée et le courrier est annulé.

+0

Je sais, cela fonctionne bien sur d'autres vues de mon application aussi. Mais sur cette vue, la feuille d'action n'apparaît jamais! Est-ce parce que mon point de vue est déjà une vue modale? – Anam

+0

puis sur quelle vue voulez-vous le mailcomposer – Splendid

7

méthode

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

n'est jamais appelée parce que vous n'appuyez sur aucun bouton UIActionSheet après l'annulation, car il n'apparaît pas à l'écran.

La raison pour laquelle cela se produit est que le UIActionSheet apparaît hors écran. Si vous vérifiez le journal de débogage, vous verrez probablement un message indiquant Présentation de la feuille d'action découpée par sa vue d'ensemble. Certains contrôles peuvent ne pas répondre aux touches. sur iPhone essayer -[UIActionSheet showFromTabBar:] ou -[UIActionSheet showFromToolbar:] au lieu de -[UIActionSheet showInView:]. »

C'est la raison pour laquelle vous voyez votre vue d'obtenir plus sombre, mais pas UIActionSheet apparaît.

Dans mon cas, le problème était que mon application est universelle, mais pour certains raison il n'y avait qu'un MainWindow.xib, et il était plus grand que la taille de l'écran de l'iPhone (il était, en fait, la taille de l'écran iPad)

La solution est de créer un autre MainWindow-iPhone.xib avec les bonnes dimensions et changer le Info.plist entrées appelées Base de fichier principale nib (iPad) et Base de fichier nib principal (iPhone) afin qu'ils pointent vers le bon fichier. Problème résolu!

Espérons que ça aide.

1

J'ai eu le même problème, a commenté '[picker release];', et ça a bien fonctionné! Explication? Je n'en ai pas.

0

Assurez-vous que vous utilisez la bonne méthode,

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

J'ai eu une certaine quelle méthode similaire qui n'a jamais été mis en œuvre appelée. Je n'ai aucune idée de ce que j'avais exactement mais le compilateur ne m'a pas donné un avertissement ou un message d'erreur.

1

Msoler a raison, la feuille d'action est affichée hors écran. Le MFMailComposeViewController affiche la feuille d'action à x: y 0: 0, vous devez donc vous assurer que la trame du contrôleur appelant est à 0: 0. J'ai rencontré un problème similaire lorsque j'ai essayé d'afficher le MFMailComposeViewController à partir d'une vue incorporée dans une vue de défilement.

0

Juste au cas où quelqu'un d'autre fait la même erreur que j'ai fait ... J'ai implémenté la méthode mailComposeController:didFinishWithResult:error: dans mon code Swift. Cela a fonctionné pendant un moment mais après plusieurs refactorings, j'ai remarqué que tout à coup, il n'était plus appelé. Finalement, j'ai remarqué que la méthode avait pris cette forme dans mon code:

private func mailComposeController(controller: MFMailComposeViewController!, didFinishWithResult result: MFMailComposeResult, error: NSError!) { 
    presentingViewController?.dismissViewControllerAnimated(true, completion: nil) 
} 

Donc, comme vous pouvez le voir j'étais un peu trop désireux de privatiser mes méthodes: Puisque la méthode est marquée @optional dans le vous MFMailComposeViewControllerDelegate faire pas besoin de l'implémenter. Et même si je l'avais implémenté, le modificateur private a caché l'implémentation - donc, de l'extérieur du fichier, il semblait que la méthode n'était pas implémentée, du tout! Cependant, puisque la méthode était facultative, le compilateur ne s'est pas plaint ...

Pour conclure: Ne marquez pas le délégué facultatif avec le modificateur private.

Je me demandais depuis que j'ai appris Swift pourquoi il n'y a plus de méthodes optionnelles - maintenant j'aurais pu comprendre ;-).

Questions connexes