6

J'utilise l'exemple d'application MailComposer d'Apple pour envoyer des e-mails depuis mon application (fonctionnalité OS 3.0). Est-il possible de définir les champs À, Objet ou Corps en tant que premier répondeur avec MFMailComposeViewController? En d'autres termes, le comportement serait: l'utilisateur appuie sur un bouton qui présente la vue de courrier (presentModalViewController). Lorsque la vue courrier est présentée, le curseur est placé dans l'un des champs et le clavier s'ouvre.Définir le premier répondeur dans MFMailComposeViewController?

je remarque la documentation MFMailComposeViewController dit:

« Important:. L'interface de composition de courrier lui-même est pas personnalisable et ne doit pas être modifié par l'application En outre, après la présentation de l'interface, l'application ne peut pas apporter d'autres modifications au contenu de l'e-mail.L'utilisateur peut toujours modifier le contenu à l'aide de l'interface, mais les modifications programmatiques sont ignorées.Ainsi, vous devez définir les valeurs des champs de contenu avant de présenter l'interface. "

Cependant, je ne me soucie pas de la personnalisation de l'interface. Je veux juste définir ce premier répondeur. Des idées?

Répondre

1

Vous pouvez essayer d'appeler simplement getFirstResponder sur le contrôleur lui-même. Si cela ne fonctionne pas, vous pouvez essayer dans le débogueur d'obtenir la liste des sous-vues de la vue de composition de courrier jusqu'à ce que vous trouviez un champ texte ou texte familier que vous pouvez ensuite coder pour définir le statut du répondeur dans le code. cela (je ne sais pas si cela va fonctionner, mais il est un exemple):

[[[[mailcomposer.view.subviews objectAtIndex:3] subviews] objectAtIndex:2] becomeFirstResponder] 
8

Vous êtes en mesure de rendre ces champs deviennent les premiers intervenants.

si vous ajoutez la méthode suivante à votre classe ...

//Returns true if the ToAddress field was found any of the sub views and made first responder 
//passing in @"MFComposeSubjectView"  as the value for field makes the subject become first responder 
//passing in @"MFComposeTextContentView" as the value for field makes the body become first responder 
//passing in @"RecipientTextField"  as the value for field makes the to address field become first responder 
- (BOOL) setMFMailFieldAsFirstResponder:(UIView*)view mfMailField:(NSString*)field{ 
    for (UIView *subview in view.subviews) { 

     NSString *className = [NSString stringWithFormat:@"%@", [subview class]]; 
     if ([className isEqualToString:field]) 
     { 
      //Found the sub view we need to set as first responder 
      [subview becomeFirstResponder]; 
      return YES; 
     } 

     if ([subview.subviews count] > 0) { 
      if ([self setMFMailFieldAsFirstResponder:subview mfMailField:field]){ 
       //Field was found and made first responder in a subview 
       return YES; 
      } 
     } 
    } 

    //field not found in this view. 
    return NO; 
} 

Ensuite, une fois que vous présentez le MFMailComposeViewController, passer le point de vue de MFMailComposeViewController dans la fonction ainsi que le champ que vous voulez devenir premier intervenant. J'aime simplifier le code et le rendre facile à comprendre.

MFMailComposeViewController *mailComposer = [[MFMailComposeViewController alloc] init]; 
mailComposer.mailComposeDelegate = self; 

/*Set up the mail composer*/ 

[self presentModalViewController:mailComposer animated:YES]; 
[self setMFMailFieldAsFirstResponder:mailComposer.view mfMailField:@"RecipientTextField"]; 
[mailComposer release]; 
+0

Excellent - heures passées à essayer de trouver quelque chose à faire. Juste besoin de changer ** RecipientTextField ** à ** MFRecipientTextField ** pour travailler. Est-ce OK à utiliser pour les soumissions App Store, ou réputé être une API non documentée? – ayreguitar

+1

Je ne suis pas sûr si cela est autorisé à utiliser pour les soumissions App Store, je l'ai seulement utilisé pour les applications internes. – holz

+0

Apple a approuvé mon application qui l'utilisait récemment, donc il semble que ce soit bon à utiliser (au moins pour l'instant!) Merci encore. – ayreguitar

0

Il suffit de mettre le code suivant après:
[self presentModalViewController: mailComposer animé: OUI];

for (UIView *subview in mailComposer.view.subviews) { 
    NSString *className = [NSString stringWithFormat:@"%@", [subview class]]; 
    //NSLog(@"%@", className); // list the views - Use this to find another view 
    //The view I want to set as first responder: "_MFMailRecipientTextField" 
    if ([className isEqualToString:@"_MFMailRecipientTextField"]){ 
    [subview becomeFirstResponder]; 
    break; // Stop search. 
    } 
} 
+0

Cela ne fonctionne pas car la récursivité est nécessaire pour naviguer dans la hiérarchie de la vue. – Gujamin

4

Dans iOS 6, il ne sera plus possible de mettre en premier intervenant sur l'un des champs de texte AFAICT. Naviguer dans la hiérarchie de la vue révèle finalement un UIRemoteView et les sous-vues ici sont obfusquées.

Questions connexes