38 votes

scaledValueForValue : appelé sur une police qui n'a pas de style de texte défini

J'utilise actuellement la préversion de Xcode 6 (non bêta) et le simulateur sur OS X 10.10 Yosemite bêta 7. J'essaie de construire un projet développé dans Xcode 6, mais l'application se plante dès que j'ouvre un certain contrôleur de vue. Ce contrôleur de vue ne contient littéralement aucun code (il s'agit d'un contrôleur de vue de tableau vide, statique, qui comporte quelques cellules et étiquettes par défaut).

L'erreur donnée est :

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason:  
'scaledValueForValue: called on a font that doesn't have a text style set'

Et juste avant qu'on me donne cette affirmation d'échec :

*** Assertion failure in -[UICTFont _scaledValueForValue:],         
/SourceCache/UIFoundation_Sim/UIFoundation-371/UIFoundation/iOS/UIFont.m:496

Je n'ai vraiment aucune idée de ce qui se passe, j'ai essayé de mettre des points d'arrêt dans le VC mais l'erreur se produit après l'appel de la méthode viewDidLoad (et donc après l'exécution de tout mon code).

Des idées ? Les polices de tous les éléments de mon projet sont "Baskerville". J'ai essayé de les modifier, mais cela n'a pas d'incidence sur le problème.

Oh, et cela fonctionne bien si j'utilise Xcode 5.

Mise à jour 9/24 : Je ne parviens toujours pas à résoudre ce problème. J'ai essayé d'utiliser la méthode fontWithDescriptor, mais ça plante toujours. Ce qui est amusant, c'est que j'ai beaucoup de pages qui utilisent des polices personnalisées et que la plupart d'entre elles fonctionnent bien, mais il y a deux VC qui plantent immédiatement lorsque j'y accède... l'une d'entre elles n'a même pas de polices personnalisées. J'apprécie vraiment tous vos commentaires, mais quelqu'un a-t-il d'autres idées ou solutions ? J'utilise la version officielle de Xcode et cela ne fonctionne toujours pas.

23voto

Jonathan Points 2814

Ce problème a été corrigé dans iOS 8.1.

Au lieu de passer du temps à construire une vue personnalisée de l'en-tête et du pied, je n'applique pas la police personnalisée aux appareils fonctionnant sous iOS 8.0. La plupart des gens auront probablement mis à jour vers iOS 8.1 de toute façon.

J'utilise le code suivant pour cela :

NSOperatingSystemVersion iOS_8_1 = (NSOperatingSystemVersion){8, 1, 0};

if (![[NSProcessInfo processInfo] respondsToSelector:@selector(isOperatingSystemAtLeastVersion:)]
    || [[NSProcessInfo processInfo] isOperatingSystemAtLeastVersion:iOS_8_1]) {
    header.textLabel.font = [UIFont fontWithName:@"Avenir-Medium" size:header.textLabel.font.pointSize];
}

La première affirmation est vraie si l'appareil fonctionne sous une version d'iOS inférieure à 8 (depuis isOperatingSystemAtLeastVersion: a été introduit dans iOS 8.0). La deuxième affirmation est vraie si l'appareil utilise iOS 8.1 ou une version ultérieure. Avec ces deux affirmations, nous excluons donc uniquement les appareils fonctionnant sous iOS 8.0.

4voto

Josh Points 128

Ok, j'ai enfin compris.

Cela se produit lorsque des vues de tableaux groupés ont des en-têtes de section et éventuellement des pieds de page. Comme solution temporaire, j'ai simplement supprimé les en-têtes/pieds de page des vues de tableaux groupés, mais si vous avez vraiment besoin de la police, vous pouvez créer une vue d'en-tête personnalisée en remplaçant "viewForHeaderInSection", et en définissant la police sur l'étiquette de votre vue personnalisée.

Néanmoins, il s'agit bien d'un bogue dans iOS 8 et nous espérons qu'il sera bientôt corrigé.

3voto

carlodurso Points 1329

Jetez un coup d'oeil : http://openradar.io/17623734

Malheureusement, à ce stade précoce de xCode 6, je ne peux offrir qu'une solution de contournement pour le crash.

Remplacez cette ligne :

[header.textLabel setFont:[UIFont fontWithName:@"HelveticaNeue-Bold" size:17]];

pour ça :

header.textLabel.font = [UIFont fontWithDescriptor:[UIFontDescriptor fontDescriptorWithFontAttributes:@{@"NSCTFontUIUsageAttribute" : UIFontTextStyleBody,
                                                                                                        @"NSFontNameAttribute" : @"HelveticaNeue-Italic"}] size:17.0];

3voto

Tyten Points 76

Comme tout le monde ici, l'application du correctif dans d'autres réponses a fait que le paramètre de la police a été ignoré. Ce que j'ai fini par faire, c'est d'avoir mes propres sous-classes UITableViewHeaderFooterView (d'où semble provenir la cause du crash) qui ont une étiquette que j'ai ajoutée moi-même. J'ai ensuite utilisé cette étiquette à la place de la propriété textLabel héritée de UITableViewHeaderFooterView, j'ai configuré les contraintes de mise en page automatique, j'ai défini la police de caractères et tout est rentré dans l'ordre (même si ce n'est pas ce que je considère comme idéal). J'ajoute que ce problème semble être propre à iOS 8.

1voto

Yury Korolev Points 11

J'ai enfin trouvé une solution de rechange. C'est simple, il suffit de construire la police dans l'autre sens :)

// 1. Grab your custom font
CGFloat size = 17.0f;
UIFont *font = [UIFont fontWithName:@"Brandon Grotesque" size:size];

// 2. Get descriptor for your font and create new descriptor with
UIFontDescriptorTextStyleAttribute and UIFontDescriptorSizeAttribute attributes from it.

UIFontDescriptor *des = [[font fontDescriptor] fontDescriptorByAddingAttributes:@{
   UIFontDescriptorTextStyleAttribute: UIFontTextStyleBody, // You can tune this style based on usage
   UIFontDescriptorSizeAttribute: @(size)
}];

// 3. Get your font
UIFont *finalFont = [UIFont fontWithDescriptor:des size:0.0]

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