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...
Ответы
Ответ 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... но иногда это работает!