Изменить заголовок MFMailComposeViewController

Я использую MFMailComposeViewController для электронной почты в приложении, но я не могу изменить заголовок. По умолчанию в заголовке отображается тема, но я бы хотел установить в заголовке что-нибудь другое. Как я могу это сделать?

Я пробовал:

controller.title = @"Feedback";

но это не сработало.

Вот мой код:

- (IBAction)email {
    NSArray *array = [[NSArray alloc] initWithObjects:@"[email protected]", nil];
    MFMailComposeViewController *controller = [[MFMailComposeViewController alloc] init];
    [[controller navigationBar] setTintColor:[UIColor colorWithRed:0.36 green:0.09 blue:0.39 alpha:1.00]];
    controller.mailComposeDelegate = self;
    controller.title = @"Feedback";
    [controller setSubject:@"Long subject"];
    [controller setMessageBody:@""
                        isHTML:NO];
    [controller setToRecipients:array];
    [self presentModalViewController:controller animated:YES];
    [controller release];
    [array release];
}

- (void)mailComposeController:(MFMailComposeViewController *)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError *)error {
    [self becomeFirstResponder];
    [self dismissModalViewControllerAnimated:YES];
}

person Sindre Sorhus    schedule 15.11.2009    source источник


Ответы (6)


Вы можете установить другой заголовок для вашего MFMailComposeViewController с помощью одной строки, например.

...
[self presentModalViewController:controller animated:YES]; // Existing line
[[[[controller viewControllers] lastObject] navigationItem] setTitle:@"SomethingElse"];
...

Однако эта реализация эффективно полагается на недокументированные функции MFMailComposeViewController. Вы получаете доступ к navigationItem частного класса (_MFMailComposeRootViewController) и меняете его заголовок на что-то другое, кроме темы письма. Я разделяю мнение Арта Гиллеспи о том, что вы не должны этого делать и, скорее всего, будете отвергнуты обозревателями Apple за то, что сделали что-то подобное. Кроме того, этот процесс может полностью измениться в любом второстепенном выпуске iPhone OS, что может вызвать сбои для ваших пользователей, пока вы не выпустите обновление, чтобы исправить поведение.

Однако решение остается за вами, и если вы все же хотите предпринять эти нерекомендуемые шаги, вы делаете это именно так.

person Bryan Henry    schedule 23.11.2009
comment
Спасибо, просто хотел узнать, как что-то подобное. Поговорив с еще несколькими людьми, я решил изменить тему письма на что-то подходящее. В любом случае, спасибо :) - person Sindre Sorhus; 24.11.2009
comment
можно было бы записать как controller.topViewController.navigationItem.title = @"SomethingElse"; - person user102008; 15.09.2011
comment
Это решение не работает для меня на iOS8 - заголовок остается на месте - person Ben Clayton; 03.03.2015

Из справочника по классу MFMailComposeViewController:

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

person Art Gillespie    schedule 15.11.2009
comment
Я знаю, но мой вопрос был не в том, разрешено ли это, а в моем вопросе; Является ли это возможным? и как? ;-) - person Sindre Sorhus; 15.11.2009
comment
Это по-прежнему актуальный ответ на ваш вопрос, поскольку использование частных API-интерфейсов на iPhone крайне не рекомендуется. Даже если это возможно, стоит знать, что это не рекомендуемый курс действий. - person Brad Larson; 15.11.2009
comment
Хорошо, может быть, ты прав, но мне все еще нравится знать, как это делать :)? - person Sindre Sorhus; 15.11.2009

Кажется, что тема сообщения кормит заголовок MFMailComposeViewController в iOS 8.

person thefoyer    schedule 22.06.2015

Вы должны иметь возможность взять просто представление (controller.view) и поместить его в свой контроллер ... в этот момент вы ничего не изменяете и на самом деле делаете почти то же самое, что и Apple в своем почтовом приложении для iPad, когда составление электронного письма ... то же самое должно работать и на iPhone ...

person Ondrej Rafaj    schedule 29.10.2010

Ответ Sbrocket отлично работает. Вот как добавить заголовок (метку):

// existing
[self presentModalViewController:controller animated:YES];

// new code
CGRect frame = CGRectMake(0, 0, 320, 44);
UILabel *label = [[UILabel alloc] initWithFrame:frame];
label.backgroundColor = [UIColor clearColor];
label.font = [UIFont fontWithName:@"MarkerFelt-Thin" size:18.0];
label.adjustsFontSizeToFitWidth = YES;
label.minimumFontSize = 12.0;
label.textAlignment = UITextAlignmentCenter;
label.textColor = [UIColor darkGrayColor];
label.text = @"Your Comments";
[[[[controller viewControllers] lastObject] navigationItem] setTitleView:label];

Те же комментарии, что и выше, не рекомендуется настраивать _2 _...

person lucasart    schedule 17.06.2012

Скорее всего, вам придется покопаться в иерархии представлений, чтобы найти необработанный UINavigationBar, содержащий заголовок, и вручную установить заголовок для него.

Программа class-dump может пригодиться здесь для определения точных используемых классов. Проба, ошибка и отладчик, скорее всего, ваш лучший выбор.

person Grant Paul    schedule 20.11.2009