Set First Responder in MFMailComposeViewController?

后端 未结 4 1434
南笙
南笙 2020-12-18 05:25

I\'m using Apple\'s MailComposer example application to send email from within my application (OS 3.0 functionality). Is it possible to set the To, Subject, or Body fields a

相关标签:
4条回答
  • 2020-12-18 05:55

    You can try just calling becomeFirstResponder on the controller itself. If that doesn't work, you can try in the debugger getting the list of subviews of the mail compose view until you find a familiar textfield or textview which you can then code specifically to set the responder status in code, which might look something like this (i don't know if this will work but it's an example):

    [[[[mailcomposer.view.subviews objectAtIndex:3] subviews] objectAtIndex:2] becomeFirstResponder]
    
    0 讨论(0)
  • 2020-12-18 06:00

    You are able to make these fields become the first responder.

    if you add the following method to your class...

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

    Then, after you present the MFMailComposeViewController, pass the MFMailComposeViewController's view into the function along with the field you want to become 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 讨论(0)
  • 2020-12-18 06:11

    In iOS 6, it is no longer possible to set first responder on any of the text fields AFAICT. Navigating the view hierarchy eventually reveals a UIRemoteView and the subviews within here are obfuscated away.

    0 讨论(0)
  • 2020-12-18 06:15

    I like to simplify the code and make it easy to understand. Just put the follow code after:
    [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 讨论(0)
提交回复
热议问题