Подтвердить что ты не робот

MFMailComposeViewController выдает viewServiceDidTerminateWithError и затем выходит при использовании настраиваемого шрифта заголовка

У меня есть самая странная проблема, с которой я столкнулся в течение длительного времени... и у меня закончились идеи.

Итак, у меня есть MFMailComposeViewController, который запускается из-за нажатия на UIButton, и он отлично запускает представление композитора. Вы видите тему, которую я назначил, но перед полями: или body заполняются вид окна вспышек и исчезает. Это вызывает эту ошибку:

viewServiceDidTerminateWithError: Error Domain = XPCObjectsErrorDomain Code = 2 "Операция не может быть выполнена. (XPCObjectsErrorDomain ошибка 2.)"

Теперь вот сумасшедшая часть. Если я переключусь на другое приложение, которое также использует MFMailComposeViewController и запустит его, вернитесь в мое приложение и снова запустите почтовый композитор, он работает нормально. Я не могу это объяснить.

Это только кажется проблемой на телефонах под управлением iOS 6, которые не являются iPhone 5.

Я искал вокруг и не могу найти кого-либо другого, кто испытал эту же проблему. У кого-нибудь есть предложения?

У меня связан MessageUI.framework, и я также обнаружил, что это не работает в Simulator или на устройстве, но когда я также связал Security.framework, он начал работать в Simulator, но он все еще не работает Не работайте на устройствах.

Мой код запуска 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...

4b9b3361

Ответ 1

Настройка настраиваемого шрифта для UITextAttributeFont для titleTestAttributes прокси-сервера внешнего вида UINavigationBar вызывает ошибку, идентифицированную 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];
}];

Ответ 2

Эта проблема недавно появилась в проекте, над которым я работаю. Мне не понравилось обходное решение выше, поэтому вместо этого я создал следующее (возможно, немного более чистое) обходное решение:

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

Ответ 3

У меня была такая же проблема. Я установил текстовые атрибуты строки заголовка для пользовательского шрифта. Когда я удалил пользовательскую спецификацию шрифта (но оставил все остальные атрибуты в пользовательских значениях), проблема исчезла.

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

Ответ 4

Сделайте это ivar:

MFMailComposeViewController *picker 

Затем после этой строки:

[self dismissModalViewControllerAnimated:YES];

добавить это:

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

Итак, выпуск сборщика не произойдет до следующего цикла runloop.

Ответ 5

Это происходит, когда мы помещаем дробное значение в пользовательский UINavigationBar, например [[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(1.5, -1.5) forBarMetrics:UIBarMetricsDefault]; Установите значение смещения как UIOffsetMake (1.0, -1.0), и это будет работать. Надеюсь, это поможет.

Ответ 6

dberwick workaound kinda works - композитор больше не отменяет себя автоматически, и настраиваемый шрифт шрифта пользовательского шрифта восстанавливается после закрытия компоновщика сообщений, но он не отображает собственный шрифт в самом компоновщике сообщений.

Я просто ненавидел то, как обходной процесс раздувал мой реальный код, так что это простой способ переместить большую часть:

- (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];
    };
}

(Это должен быть комментарий к ответу dberwicks, но это не позволит использовать этот код.)

Ответ 7

У меня такая же проблема, но я решил, что решил ее подклассифицировать UINavigationBar. Я изменяю внешний вид моего подкласса вместо UINavigationBar.

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

Ответ 8

Просто добавив композитора, поскольку iVar решил проблему для меня.

MFMailComposeViewController * emailComposer;

Ответ 9

Из того, что я прочитал, в iOS 6 это устарело:

[self presentModalViewController:picker animated:YES];

Они предлагают использовать:

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

в паре с (в didFinishWithResult)

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

К сожалению, это работает только на Simulator... но иногда это работает!