Изменить заголовок MFMailComposeViewController - PullRequest
14 голосов
/ 15 ноября 2009

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

Я пробовал:

controller.title = @"Feedback";

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

Вот мой код:

- (IBAction)email {
    NSArray *array = [[NSArray alloc] initWithObjects:@"myemail@gmail.com", 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];
}

Ответы [ 6 ]

21 голосов
/ 23 ноября 2009

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

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

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

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

14 голосов
/ 15 ноября 2009

Из ссылки на класс MFMailComposeViewController:

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

3 голосов
/ 22 июня 2015

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

2 голосов
/ 17 июня 2012

Ответ 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];

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

2 голосов
/ 29 октября 2010

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

0 голосов
/ 20 ноября 2009

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

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

...