web-dev-qa-db-fra.com

MFMailComposeViewController lève viewServiceDidTerminateWithError puis se ferme lors de l'utilisation d'une police de titre personnalisée.

J'ai le problème le plus étrange que j'ai rencontré depuis longtemps ... et je suis à court d'idées.

Donc, j'ai un MFMailComposeViewController qui est lancé en tapant sur un UIButton et il lance très bien la vue du composeur de courrier. Vous voyez le sujet que j'ai assigné mais avant que le ou: les champs du corps soient remplis, le type de fenêtre clignote et disparaît. Il jette cette erreur:

viewServiceDidTerminateWithError: Domaine d'erreur = Code XPCObjectsErrorDomain = 2 "L'opération n'a pas pu être terminée. (Erreur 2. de XPCObjectsErrorDomain)."

Maintenant, voici la partie folle. Si je bascule vers une autre application qui utilise également un MFMailComposeViewController et que je lance celle-ci, puis que je retourne à mon application et lance à nouveau le composeur de messagerie, cela fonctionne parfaitement. Je ne peux pas expliquer ça.

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

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

J'ai lié le MessageUI.framework et j'ai aussi constaté que cela ne fonctionnait pas dans le simulateur ou sur un périphérique, mais lorsque j'ai également lié le Security.framework, il a commencé à fonctionner dans le simulateur, mais cela ne fonctionne toujours pas. sur les appareils.

Mon code pour lancer le MFMailComposeViewController est ci-dessous:

dans le fichier .h

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

dans le fichier .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];
}

Mise à jour: Je pense que je l'ai réduit aux paramètres que j'ai transmis au délégué à l'apparence pour le UINavigationBar. Je l'ai en utilisant une police personnalisée, et si je l'éteindre, cela semble fonctionner ... mais pourquoi cela fonctionnerait-il sur l'iPhone5 ... 

36
gplocke

La définition d'une police personnalisée pour UITextAttributeFont sur titleTestAttributes du proxy d'apparence UINavigationBar provoque le bogue identifié par l'OP et MightlyLeader.

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

Ce problème est récemment apparu sur un projet sur lequel je travaille. La solution de contournement ci-dessus ne m'a pas vraiment plu, alors j'ai créé la solution suivante (peut-être un peu plus propre):

// 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

J'avais le même problème. J'avais défini les attributs de texte de la barre de titre sur une police personnalisée. Lorsque j'ai supprimé la spécification de police personnalisée (mais que tous les autres attributs ont des valeurs personnalisées), le problème a disparu.

Mon diagnostic est que le chargement des polices personnalisées prend trop de temps et que cela déclenche un délai d'attente à partir des délais d'attente.

9
Cocoadelica

Faites-en un ivar:

MFMailComposeViewController *picker 

Puis après cette ligne:

[self dismissModalViewControllerAnimated:YES];

ajoute ça:

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

Pour que la libération du sélecteur ne se produise pas avant le prochain cycle runloop.

3
David H

Cela se produit lorsque nous plaçons une valeur fractionnelle dans la barre UINavigationBar personnalisée, par exemple [[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(1.5, -1.5) forBarMetrics:UIBarMetricsDefault]; Définissez la valeur de décalage sur UIOffsetMake (1.0, -1.0) et cela fonctionnera. J'espère que cela aidera.

2
Slashik

la solution de contournement de dberwick fonctionne un peu - le compositeur ne s’annule plus automatiquement et le paramètre de police de titre de barre de navigation personnalisé est restauré une fois que vous fermez le composeur de message, mais ne montre pas la police personnalisée dans le composeur de message lui-même.

Je détestais simplement la façon dont la solution de contournement alourdissait mon code réel. Voici donc un moyen simple de déplacer la plupart de ces informations:

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

(Cela devrait vraiment être un commentaire pour la réponse de dberwick, mais cela ne permettrait pas autant de code.)

1
Yang Meyer

J'ai le même problème mais je pense l'avoir résolu en sous-classant UINavigationBar. Je change l'apparence de ma sous-classe à la place de UINavigationBar.

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

Ajouter simplement le compositeur en tant que iVar a résolu le problème pour moi.

MFMailComposeViewController * emailComposer; 

0
Ram E.K