MFMailComposeViewController的标题更改

14

我正在我的应用程序中使用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

您可以使用一行代码来为您的MFMailComposeViewController设置不同的标题,例如:

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

然而,这种实现方式有效地依赖于MFMailComposeViewController的未记录特性。您正在访问私有类(_MFMailComposeRootViewController)的navigationItem,并将其标题更改为邮件主题以外的其他内容。我赞同Art Gillespie的观点,您不应该这样做,并且很可能因此被苹果审核员拒绝。此外,在iPhone OS的任何小版本发布中,这个过程都可能会发生完全的变化,从而可能导致用户的崩溃,直到您能够发布修复此行为的更新为止。

不过,决定权在您手中,如果您仍想采取这些不推荐的步骤,那就是如何做到的。


1
谢谢,我只是想知道如何做这样的事情。和更多的人交流之后,我决定改变邮件主题以适应情况。无论如何,谢谢 :) - Sindre Sorhus
2
可以这样写:controller.topViewController.navigationItem.title = @"SomethingElse"; - user102008
这个解决方案在iOS8上对我不起作用 - 标题保持不变。 - Ben Clayton

14

来自MFMailComposeViewController类参考文档:

重要提示:邮件撰写界面本身不可定制,也不能被您的应用程序修改。此外,在呈现了界面之后,您的应用程序不能对电子邮件内容进行进一步更改。


1
我知道,但我的问题不是它是否被允许,而是它是否可能?如何实现?;-) - Sindre Sorhus
9
尽管iPhone上使用私有API已被强烈反对,但这仍然是针对你问题的相关回答。即使可能性存在,值得知道的是这不是建议采取的行动。 - Brad Larson
1
好的,也许你是对的,但我仍然想知道如何做到这一点 :) ? - Sindre Sorhus

3

在iOS 8中,邮件主题将作为MFMailComposeViewController的标题。


2

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

你应该能够将一个视图(controller.view)放置在控制器内部......在那一刻,你没有修改任何东西,实际上你正在做和苹果公司在他们的iPad邮件应用程序中撰写电子邮件时几乎相同的事情......同样的事情也适用于iPhone......


0

很可能,您需要深入查找视图层次结构,以找到包含标题的原始UINavigationBar,并手动设置该标题。

在确定使用的确切类时,程序类转储可能会派上用场。试验、错误和调试器很可能是您最好的选择。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接