36 votes

MFMailComposeViewController jette un viewServiceDidTerminateWithError, puis se ferme lors de l'utilisation d'un titre personnalisé de police

J'ai le plus étrange problème que j'ai rencontré dans un temps long...et je suis à court d'idées.

Donc j'ai un MFMailComposeViewController qui est lancé à partir de la frappe sur un UIButton et c'est le lancement de la messagerie compositeur vue de l'amende juste. Vous voir le sujet que j'ai attribué, mais avant le corps ou les champs sont remplis, la fenêtre type de bouffées de chaleur et disparaît. Il met cette erreur:

viewServiceDidTerminateWithError: Erreur de Domaine=XPCObjectsErrorDomain Code=2 "L'opération ne pouvait pas être complété. (XPCObjectsErrorDomain erreur 2.)"

Maintenant, voici la partie folle. Si je passe à une autre application qui utilise également une MFMailComposeViewController et lancer celui-ci, avant de revenir à mon application et de lancer la messagerie compositeur de nouveau, il fonctionne très bien. Je ne peux pas l'expliquer.

Cela ne semble être un problème sur les téléphones fonctionnant sous iOS 6 qui ne sont pas de l'iPhone 5.

J'ai cherché partout et n'arrive pas à trouver quelqu'un d'autre qui ont connu ce même problème. Quelqu'un a des suggestions?

J'ai la MessageUI.cadre lié et j'ai également trouvé que ce n'était pas de travail dans le Simulateur ou sur un périphérique, mais lorsque j'ai également liée à la Sécurité.cadre, il a commencé à travailler dans le Simulateur, mais cela ne fonctionne toujours pas sur les appareils.

Mon code pour le lancement de la MFMailComposeViewController est ci-dessous:

dans l' .h fichier

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

dans l' .m fichier

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

Mise à jour: je crois que j'ai rétréci vers le bas pour les paramètres que j'ai passé à l'apparence délégué pour la UINavigationBar. Je l'ai utiliser une police personnalisée, et si je désactiver cette fonction, cela semble fonctionner...mais pourquoi que les travaux sur l'iPhone5...

16voto

dberwick Points 171

Définition d'une police personnalisée pour la UITextAttributeFont à la titleTestAttributes de la UINavigationBar apparence proxy provoque le bug que l'OP et MightlyLeader identifiés.

Code Solution De Contournement:

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

12voto

jnjosh Points 111

Ce problème a récemment surgi sur un projet, je travaille sur. Je n'ai pas vraiment la solution de contournement ci-dessus donc, au lieu de cela, j'ai créé les suivants (peut-être un peu plus propre) solution de contournement:

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

9voto

Cocoadelica Points 1703

J'ai eu le même problème. J'avais mis les attributs de texte de la barre de titre d'une police personnalisée. Quand j'ai enlevé la police personnalisée spécification (mais la gauche a tous les autres attributs à des valeurs personnalisées) le problème a disparu.

Mon diagnostic est que les polices personnalisées prendre trop de temps à charger et il déclenche un délai dans l'attente de clôtures.

3voto

David H Points 23654

Faire un ivar:

MFMailComposeViewController *picker 

Puis, après cette ligne:

[self dismissModalViewControllerAnimated:YES];

ajouter ceci:

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

Alors que la sortie du sélecteur de ne pas arriver jusqu'à la prochaine runloop cycle.

2voto

Slashik Points 196

Ce qui se passe quand nous le mettons en valeur fractionnaire dans la coutume UINavigationBar par exemple [[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(1.5, -1.5) forBarMetrics:UIBarMetricsDefault]; Réglage de la compensation de la valeur que UIOffsetMake(1.0, -1.0) et que cela fonctionne. Espérons que cette aide.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X