Изменить название 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];
}

Ответы

Ответ 1

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

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

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

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

Ответ 2

Из справки класса MFMailComposeViewController:

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

Ответ 3

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

Ответ 4

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

Ответ 5

Ответ на 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...

Ответ 6

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

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