Установить первый ответчик в MFMailComposeViewController?

Я использую пример приложения Apple MailComposer для отправки электронной почты из моего приложения (функциональность OS 3.0). Можно ли установить поля "Кому", "Тема" или "Тело" в качестве первого респондента с помощью MFMailComposeViewController?

Другими словами, поведение будет таким: пользователь нажимает кнопку, которая представляет представление почты (presentModalViewController). Когда представление почты представлено, курсор помещается в одно из полей, и клавиатура открывается.

Я заметил, что документация MFMailComposeViewController гласит:

"Важно: сам интерфейс составления почты не настраивается и не должен изменяться вашим приложением. Кроме того, после представления интерфейса вашему приложению не разрешается вносить дополнительные изменения в содержимое электронного письма. Пользователь по-прежнему может редактировать содержимое с помощью интерфейс, но программные изменения игнорируются. Таким образом, вы должны установить значения полей содержимого перед представлением интерфейса ".

Тем не менее, я не забочусь о настройке интерфейса. Я просто хочу установить этот firstResponder. Есть идеи?

4 ответа

Вы можете сделать эти поля стать первым респондентом.

если вы добавите следующий метод в свой класс...

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

Затем, после представления MFMailComposeViewController, передайте представление MFMailComposeViewController в функцию вместе с полем, которое вы хотите стать первым респондентом.

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];

В iOS 6 больше нельзя установить первого респондента на любом из текстовых полей AFAICT. Навигация по иерархии представлений в конечном итоге выявляет UIRemoteView, и подпредставления внутри здесь скрыты.

Вы можете попробовать просто позвонить в comeFirstResponder на самом контроллере. Если это не сработает, вы можете попробовать в отладчике получить список подпредставлений представления составления почты, пока не найдете знакомое текстовое поле или текстовое представление, которое затем можно специально кодировать, чтобы установить статус респондента в коде, который может выглядеть примерно так: это (я не знаю, будет ли это работать, но это пример):

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

Мне нравится упрощать код и облегчать его понимание. Просто введите следующий код после:
[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.
  }
}
Другие вопросы по тегам