6

Utilizzo l'applicazione di esempio MailComposer di Apple per inviare e-mail dalla mia applicazione (funzionalità OS 3.0). È possibile impostare i campi A, Oggetto o Corpo come primo risponditore con MFMailComposeViewController?Imposta il primo risponditore in MFMailComposeViewController?

In altre parole, il comportamento sarebbe: l'utente preme un pulsante che presenta la vista della posta (presentModalViewController). Quando viene visualizzata la vista della posta, il cursore viene posizionato in uno dei campi e la tastiera si apre.

ho notato la documentazione MFMailComposeViewController dice:

". Importante: L'interfaccia di composizione di posta stesso non è personalizzabile e non deve essere modificato dall'applicazione Inoltre, dopo aver presentato l'interfaccia, l'applicazione non è permesso apportare ulteriori modifiche al contenuto dell'email L'utente può ancora modificare il contenuto utilizzando l'interfaccia, ma le modifiche programmatiche vengono ignorate, pertanto è necessario impostare i valori dei campi del contenuto prima di presentare l'interfaccia. "

Tuttavia, non mi interessa personalizzare l'interfaccia. Voglio solo impostare quel firstResponder. Qualche idea?

risposta

1

Si può provare a chiamare semplicemente diventatoFirstResponder sul controller stesso. Se ciò non funziona, puoi provare nel debugger ottenere l'elenco delle sottoview della vista di composizione della posta finché non trovi un campo di testo o una textview familiare che puoi quindi codificare in modo specifico per impostare lo stato del risponditore nel codice, che potrebbe sembrare qualcosa di simile questo (non so se funzionerà ma è un esempio):

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

È possibile rendere questi campi diventare il primo risponditore.

se si aggiunge il seguente metodo alla 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; 
} 

Poi, dopo l'utente è in MFMailComposeViewController, passano di vista della MFMailComposeViewController nella funzione insieme con il campo che si desidera diventare first 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

Eccellente: ore trascorse a cercare di trovare qualcosa per farlo. Doveva solo cambiare ** RecipientTextField ** in ** MFRecipientTextField ** per funzionare. Va bene usare questo per gli invii di App Store o essere considerato API non documentata? – ayreguitar

+1

Non sono sicuro che l'utilizzo di App Store sia consentito, l'ho usato solo per applicazioni interne. – holz

+0

Apple ha approvato la mia app che l'ha usata di recente, quindi sembra che sia valida (almeno per ora!) Grazie ancora. – ayreguitar

0

mi piace semplificare il codice e lo rendono facile da capire. Basta inserire il seguente codice dopo:
[auto presenteModalViewController: mailComposer animato: 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

Questo non funziona poiché la ricorsione è necessaria per navigare nella gerarchia della vista. – Gujamin

4

In iOS 6, non è più possibile impostare il primo risponditore su uno dei campi di testo AFAICT. La navigazione nella gerarchia della vista rivela alla fine una UIRemoteView e le sottoview all'interno di questo sono offuscate.

Problemi correlati