2009-11-06 11 views
6

Estoy usando la aplicación de ejemplo MailComposer de Apple para enviar correos electrónicos desde mi aplicación (funcionalidad OS 3.0). ¿Es posible establecer los campos Para, Asunto o Cuerpo como primeros respondedores con MFMailComposeViewController?Establecer el Primer Respondedor en MFMailComposeViewController?

En otras palabras, el comportamiento sería: el usuario presiona un botón que presenta la vista de correo (presentModalViewController). Cuando se presenta la vista de correo, el cursor se coloca en uno de los campos y se abre el teclado.

noto la documentación MFMailComposeViewController dice:

"Importante:. La propia interfaz de composición mail no es personalizable y no debe ser modificado por la aplicación Además, después de la presentación de la interfaz, su aplicación no se le permite realice más cambios en el contenido del correo electrónico. El usuario aún puede editar el contenido mediante la interfaz, pero los cambios programáticos se ignoran. Por lo tanto, debe establecer los valores de los campos de contenido antes de presentar la interfaz ".

Sin embargo, no me importa personalizar la interfaz. Solo quiero establecer ese primer Respondedor. ¿Algunas ideas?

Respuesta

1

Puede intentar simplemente llamar a becomeFirstResponder en el controlador mismo. Si eso no funciona, puede probar en el depurador obtener la lista de subvistas de la vista de redacción de correo hasta que encuentre un campo de texto o una vista de texto que le resulte familiar y luego codifique específicamente para establecer el estado del respondedor en código, que podría parecerse a esto (no sé si esto va a funcionar, pero es un ejemplo):

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

Usted es capaz de hacer que estos campos se convierten en el primer nivel de respuesta.

si se añade el siguiente método a la clase ...

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

Entonces, después de presentar la MFMailComposeViewController, pase la opinión de la MFMailComposeViewController en la función, junto con el campo que desea llegar a ser el primero en responder.

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

Excelente: pasé horas intentando encontrar algo para hacer esto. Solo necesito cambiar ** RecipientTextField ** a ** MFRecipientTextField ** para que funcione. ¿Está bien utilizarlo para las entregas de la App Store o se considera una API no documentada? – ayreguitar

+1

No estoy seguro si esto está bien para las presentaciones de la App Store, solo lo he usado para aplicaciones internas. – holz

+0

Apple aprobó mi aplicación que usó esto recientemente, por lo que parece que está bien usarla (¡al menos por ahora!) Gracias de nuevo. – ayreguitar

0

Me gusta simplificar el código y hacerlo fácil de entender. Simplemente ponga el siguiente código después de:
[self presentModalViewController: mailComposer animated: YES];

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

Esto no funciona, ya que la recursividad es necesaria para navegar por la jerarquía de vista. – Gujamin

4

En iOS 6, que ya no es posible establecer de primera respuesta en cualquiera de los campos de texto AFAICT. Navegar por la jerarquía de vistas finalmente revela un UIRemoteView y las subvistas aquí se ocultan.

Cuestiones relacionadas