6

Ich verwende Apples MailComposer Beispielanwendung zum Senden von E-Mails aus meiner Anwendung (OS 3.0-Funktionalität). Ist es möglich, mit MFMailComposeViewController die Felder "An", "Betreff" oder "Body" als First Responder festzulegen?Legen Sie First Responder in MFMailComposeViewController fest?

Mit anderen Worten, das Verhalten wäre: der Benutzer drückt eine Schaltfläche, die die Mail-Ansicht (presentModalViewController) präsentiert. Wenn die Mail-Ansicht angezeigt wird, wird der Cursor in eines der Felder platziert und die Tastatur öffnet sich.

Ich bemerke die MFMailComposeViewController Dokumentation sagt:

„. Wichtig: Die E-Mail Zusammensetzung Schnittstelle selbst nicht anpassbar ist und darf nicht von der Anwendung geändert werden Darüber hinaus wird nach der Schnittstelle präsentiert, wird Ihre Anwendung nicht erlaubt Nehmen Sie weitere Änderungen am E-Mail-Inhalt vor. Der Benutzer kann den Inhalt weiterhin über die Schnittstelle bearbeiten, aber programmatische Änderungen werden ignoriert. Daher müssen Sie die Werte der Inhaltsfelder vor dem Anzeigen der Schnittstelle festlegen. "

Allerdings ist es mir egal, die Schnittstelle anzupassen. Ich möchte nur den FirstResponder einstellen. Irgendwelche Ideen?

Antwort

1

Sie können versuchen, nur auf dem Controller selbst findFirstResponder aufrufen. Wenn das nicht funktioniert, können Sie versuchen, im Debugger die Liste der Teilansichten der E-Mail-Verfassen-Ansicht abzurufen, bis Sie ein vertrautes Textfeld oder eine Textansicht finden, die Sie dann speziell programmieren können, um den Responder-Status im Code festzulegen dies (ich weiß nicht, ob dies funktionieren wird, aber es ist ein Beispiel):

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

Sie können diese Felder werden die Ersthelfer machen.

, wenn Sie die folgende Methode zur Klasse hinzufügen ...

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

Dann, nachdem Sie die MFMailComposeViewController präsentieren, die Sicht in die Funktion des MFMailComposeViewController passieren zusammen mit dem Feld, das Sie Ersthelfer werden wollen.

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

Ausgezeichnet - verbrachte Stunden damit, etwas zu finden, um dies zu tun. Nur benötigt, um ** RecipientTextField ** zu ** MFRecipientTextField ** zu ändern. Ist dies in Ordnung für App Store-Einreichungen oder als nicht dokumentierte API? – ayreguitar

+1

Ich bin nicht sicher, ob dies für App Store-Einreichungen in Ordnung ist, ich habe dies nur für In-House-Anwendungen verwendet. – holz

+0

Apple hat meine App, die das kürzlich verwendet hat, genehmigt, also sieht es aus, als ob es in Ordnung ist (zumindest für jetzt!) Danke nochmal. – ayreguitar

0

Ich mag es, den Code zu vereinfachen und leicht verständlich zu machen. Einfach folgenden Code eingeben:
[self presentModalViewController: mailComposer animiert: 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

Dies funktioniert nicht, da die Rekursion erforderlich ist, um durch die Ansichtshierarchie zu navigieren. – Gujamin

4

In iOS 6 ist es nicht mehr möglich, First Responder auf einem der Textfelder AFAICT zu setzen. Beim Navigieren in der Ansichtshierarchie wird schließlich eine UIRemoteView angezeigt, und die darin enthaltenen Unteransichten sind verdeckt.