web-dev-qa-db-ja.com

MFMailComposeViewControllerは、viewServiceDidTerminateWithErrorをスローし、カスタムタイトルフォントを使用すると終了します

私は長い間遭遇した最も奇妙な問題を抱えています...そして私はアイデアを使い果たしました。

だから私はUIButtonをタップすることから起動されているMFMailComposeViewControllerを持っていて、それはメールを起動していますcomposerビューはうまくいきます。私が割り当てた件名が表示されますが、to:またはbodyの前にありますフィールドにデータが入力されると、ウィンドウの種類が点滅して消えます。次のエラーがスローされます。

viewServiceDidTerminateWithError:Error Domain = XPCObjectsErrorDomain Code = 2 "操作を完了できませんでした。(XPCObjectsErrorDomainエラー2)"

今ここにクレイジーな部分があります。 MFMailComposeViewControllerを使用する別のアプリに切り替えて起動した後、アプリに戻ってメールを起動するとcomposer、正常に動作します。説明できません。 。

これは、iPhone 5ではないiOS6を実行している電話でのみ問題になるようです。

私は周りを検索しましたが、これと同じ問題を経験した人を見つけることができないようです。誰か提案がありますか?

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:@"[email protected]"];

[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で機能するのでしょうか...

36
gplocke

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];
}];
16
dberwick

この問題は、私が取り組んでいるプロジェクトで最近発生しました。上記の回避策が気に入らなかったので、代わりに次の(おそらく少しクリーンな)回避策を作成しました。

// 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],
 }];
12
jnjosh

私も同じ問題を抱えていました。タイトルバーのテキスト属性をカスタムフォントに設定しました。カスタムフォント仕様を削除すると(ただし、他のすべての属性はカスタム値のままにしました)、問題は解消されました。

私の診断では、カスタムフォントの読み込みに時間がかかりすぎて、待機フェンスからのタイムアウトがトリガーされます。

9
Cocoadelica

これをivarにします。

MFMailComposeViewController *picker 

次に、この行の後:

[self dismissModalViewControllerAnimated:YES];

これを追加:

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

そのため、ピッカーの解放は次の実行ループサイクルまで発生しません。

3
David H

これは、たとえば[[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(1.5, -1.5) forBarMetrics:UIBarMetricsDefault];オフセット値をUIOffsetMake(1.0、-1.0)として設定するなど、カスタムUINavigationBarに小数値を入力すると発生します。これは機能します。お役に立てれば。

2
Slashik

dberwickの回避策はちょっと機能します-composerは自動的にキャンセルされなくなり、メッセージコンポーザーを閉じるとカスタムナビゲーションバーのタイトルフォント設定が復元されますしかし表示されませんメッセージ内のカスタムフォントcomposer自体。

回避策が実際のコードを肥大化させるのが嫌だったので、コードの大部分を移動する簡単な方法を次に示します。

- (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の回答に対するコメントであるはずですが、これほど多くのコードを使用することはできません。)

1
Yang Meyer

同じ問題がありますが、UINavigationBarをサブクラス化することで解決したと思います。 UINavigationBarの代わりにサブクラスの外観を変更します。

[[MYNavigationBar appearance] setTitleTextAttributes:@{
    UITextAttributeFont : [UIFont fontWithName:@"Custom Font" size:25]
}];
1
David Brockman

IVarが問題を解決したので、composerを追加するだけです。

MFMailComposeViewController * emailComposer;

0
Ram E.K