36

我遇到了很长一段时间以来遇到的最奇怪的问题……而且我的想法已经用完了。

所以我有一个 MFMailComposeViewController ,它通过点击 UIButton 启动,它启动邮件编写器视图就好了。您会看到我分配的主题,但在 to: 或 body 字段填充之前,窗口会闪烁并消失。它抛出这个错误:

viewServiceDidTerminateWithError: Error Domain=XPCObjectsErrorDomain Code=2 “操作无法完成。(XPCObjectsErrorDomain 错误 2。)”

现在这是疯狂的部分。如果我切换到另一个也使用 MFMailComposeViewController 的应用程序并启动该应用程序,然后切换回我的应用程序并再次启动邮件编写器,它就可以正常工作。我无法解释。

这似乎只是运行 iOS 6 而不是iPhone 5 的手机上的问题。

我四处搜寻,似乎找不到其他遇到同样问题的人。有人有什么建议吗?

我已经链接了 MessageUI.framework,我还发现这在模拟器或设备上不起作用,但是当我还链接 Security.framework 时,它开始在模拟器中工作,但它仍然不起作用在设备上。

我启动 MFMailComposeViewController 的代码如下:

在 .h 文件中

#import <MessageUI/MessageUI.h>
#import <MessageUI/MFMailComposeViewController.h>

在 .m 文件中

-(void)displayComposerSheet {
MFMailComposeViewController *picker = [[MFMailComposeViewController alloc] init];
picker.mailComposeDelegate = self;

[picker setSubject:@"Support Request"];

// Set up recipients
NSArray *toRecipients = [NSArray arrayWithObject:@"support@domain.com"];

[picker setToRecipients:toRecipients];

// Fill out the email body text
NSString *emailBody = @"\n\nEmail from iOS";
[picker setMessageBody:emailBody isHTML:NO];

[self presentModalViewController:picker animated:YES];
}


// Dismisses the email composition interface when users tap Cancel or Send. Proceeds to update the message field with the result of the operation. 
- (void)mailComposeController:(MFMailComposeViewController*)controller     didFinishWithResult:(MFMailComposeResult)result error:(NSError*)error
{

    [self dismissModalViewControllerAnimated:YES];
}

更新: 我想我已经把它缩小到我已经传递给 UINavigationBar 的外观委托的设置。我有它使用自定义字体,如果我将其关闭,它似乎可以工作......但为什么它会在 iPhone5 上工作......

4

9 回答 9

16

将 UITextAttributeFont 的自定义字体设置为 UINavigationBar 外观代理的 titleTestAttributes 会导致 OP 和 MightlyLeader 识别的错误。

解决方法代码:

// remove the custom nav bar font
NSMutableDictionary* navBarTitleAttributes = [[UINavigationBar appearance] titleTextAttributes].mutableCopy;
UIFont* navBarTitleFont = navBarTitleAttributes[UITextAttributeFont];
navBarTitleAttributes[UITextAttributeFont] = [UIFont systemFontOfSize:navBarTitleFont.pointSize];
[[UINavigationBar appearance] setTitleTextAttributes:navBarTitleAttributes];

// set up and present the MFMailComposeViewController
MFMailComposeViewController *mailComposer = [[MFMailComposeViewController alloc] init];
mailComposer.mailComposeDelegate = self;
[mailComposer setSubject:emailInfo[@"subject"]];
[mailComposer setMessageBody:emailInfo[@"message"] isHTML:YES];
mailComposer.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
[self presentViewController:mailComposer animated:YES completion:^{

    // add the custom navbar font back
    navBarTitleAttributes[UITextAttributeFont] = navBarTitleFont;
    [[UINavigationBar appearance] setTitleTextAttributes:navBarTitleAttributes];
}];
于 2013-01-30T03:17:40.027 回答
12

这个问题最近出现在我正在做的一个项目上。我不太喜欢上面的解决方法,所以我创建了以下(可能更简洁)的解决方法:

// Implement the custom font for all UINavigationBar items
[[UINavigationBar appearance] setTitleTextAttributes:
@{
    UITextAttributeFont : [UIFont custom_superAwesomeFontWithSize:16.0f],
}];


// Disable the custom font when the NavigationBar is presented in a MFMailComposeViewController
[[UINavigationBar appearanceWhenContainedIn:[MFMailComposeViewController class], nil] setTitleTextAttributes:
 @{
    UITextAttributeFont : [UIFont boldSystemFontOfSize:14.0f],
 }];
于 2013-08-08T15:34:38.933 回答
9

我遇到过同样的问题。我已将标题栏的文本属性设置为自定义字体。当我删除自定义字体规范(但将所有其他属性留给自定义值)时,问题就消失了。

我的诊断是自定义字体加载时间过长,并且会触发等待围栏的超时。

于 2012-11-26T15:55:18.417 回答
3

将其设为 ivar:

MFMailComposeViewController *picker 

然后在这一行之后:

[self dismissModalViewControllerAnimated:YES];

添加这个:

dispatch_async(dispatch_get_main_queue(), ^{ picker = nil; });

这样选择器的释放直到下一个 runloop 循环才会发生。

于 2012-09-27T17:08:15.010 回答
2

当我们在自定义 UINavigationBar 中放置小数值时会发生这种情况,例如 [[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(1.5, -1.5) forBarMetrics:UIBarMetricsDefault]; 将偏移值设置为 UIOffsetMake(1.0, -1.0) 并且这将起作用。希望这可以帮助。

于 2013-02-28T09:32:31.887 回答
1

我有同样的问题,但我认为我通过子类化 UINavigationBar 解决了它。我更改了子类的外观而不是 UINavigationBar。

[[MYNavigationBar appearance] setTitleTextAttributes:@{
    UITextAttributeFont : [UIFont fontWithName:@"Custom Font" size:25]
}];
于 2013-07-18T13:17:25.013 回答
1

dberwick 的解决方法有点工作 - 作曲家不再自动取消自己,并且一旦您关闭消息编辑器,自定义导航栏标题字体设置就会恢复,它不会在消息编辑器本身中显示自定义字体。

我只是讨厌解决方法如何使我的实际代码变得臃肿,所以这里有一个简单的方法可以将大部分代码移出:

- (void)presentMessageCommposer
    void (^workaroundRestoreFont)(void) = [self ym__workaroundCustomFontInMessageComposer];

    MFMailComposeViewController *mailComposeVC = [MFMailComposeViewController new];
    // ... set up the composer: message body, subject, etc ...
    [self presentViewController:mailComposeVC animated:YES completion:workaroundRestoreFont];
}


// ugly workaround stuff
// move this to the bottom of your class, collapse it, or put it in a category
- (void (^)(void))ym__workaroundCustomFontInMessageComposer
{
    // Bug http://openradar.appspot.com/13422715
    // remove the custom nav bar font
    NSMutableDictionary* navBarTitleAttributes = [[UINavigationBar appearance] titleTextAttributes].mutableCopy;
    UIFont *navBarTitleFont = navBarTitleAttributes[UITextAttributeFont];
    navBarTitleAttributes[UITextAttributeFont] = [UIFont systemFontOfSize:navBarTitleFont.pointSize];
    [[UINavigationBar appearance] setTitleTextAttributes:navBarTitleAttributes];

    return ^{
        // add the custom navbar font back
        NSMutableDictionary* navBarTitleAttributes = [[UINavigationBar appearance] titleTextAttributes].mutableCopy;
        navBarTitleAttributes[UITextAttributeFont] = navBarTitleFont;
        [[UINavigationBar appearance] setTitleTextAttributes:navBarTitleAttributes];
    };
}

(这确实应该是对 dberwick 答案的评论,但这不允许有这么多代码。)

于 2013-03-15T22:42:21.567 回答
0

只需将作曲家添加为 iVar 即可解决我的问题。

MFMailComposeViewController *emailComposer;

于 2015-11-16T16:35:09.423 回答
-2

根据我所读到的,在 iOS 6 中,这已被弃用:

[self presentModalViewController:picker animated:YES];

他们建议使用:

[self presentViewController:picker animated:YES completion:nil];

didFinishWithResult与 (in )配对

[[controller presentingViewController] dismissViewControllerAnimated:YES completion:nil];

不幸的是,这只能在模拟器上间歇性地工作......但有时它确实有效!

于 2013-01-24T20:09:21.503 回答