web-dev-qa-db-fra.com

Pourquoi [[UINavigationBar apparence] setTranslucent: NO] plante mon application?

Même question que this , mais cette question a été évitée (à cause de NDA à l'époque) et n'est plus active.

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** Illegal property type, c for appearance setter, _installAppearanceSwizzlesForSetter:'

Je le place dans viewDidLoad de mon contrôleur de vue initial. setTranslucent apparaît sur la saisie semi-automatique et ne se plaint pas avant de planter et de parler de swizzles et d'autres choses.

Toute information à ce sujet serait formidable, j'ai toujours du mal à obtenir une apparence de barre d'état cohérente dans mon application.

38
user

Il semble que la propriété translucent ne puisse tout simplement pas être définie à l'aide de UIAppearance. Je ne sais pas exactement pourquoi, mais je suppose que certaines propriétés ne sont tout simplement pas prises en charge. Cependant, j'ai résolu ce problème en créant un UIViewController personnalisé et en faisant de tous les autres viewControllers de mon application une sous-classe de ce viewController personnalisé. De cette façon, je peux définir des propriétés globales (telles que translucent dans votre cas) qui seront héritées par tous les autres viewControllers de mon application. Je sais que c'est une sorte de grand changement, mais j'espère que cela aide.

**** MODIFIER ****

Depuis iOS 8, la translucidité peut être définie avec UIAppearance:

Objectif c

if([UIDevice currentDevice].systemVersion.floatValue >= 8.0) {

    [[UINavigationBar appearance] setTranslucent:YES];
}

Swift

if (UIDevice.currentDevice().systemVersion as NSString).floatValue >= 8.0 {

    UINavigationBar.appearance().translucent = true
}
54
hgwhittle

Vous pouvez le tromper cependant en spécifiant une image qui n'existe pas, ce qui rendra la barre d'outils opaque

[[UIToolbar appearance] setBackgroundColor:[UIColor colorWithRed:219.0/255.0 green:67.0/255.0 blue:67.0/255.0 alpha:1.0]];

[[UIToolbar appearance] setBackgroundImage:[[UIImage alloc] init] forToolbarPosition:UIBarPositionAny barMetrics:UIBarMetricsDefault];
8
JulianB

vous plantez parce que vous utilisez la méthode illégale. dans UIAppearance, il dit

To participate in the appearance proxy API, tag your appearance property selectors in your header with UI_APPEARANCE_SELECTOR.

cela signifie que lorsque vous utilisez [[XXX appearance] method], la méthode method doit avoir l'attribut UI_APPEARANCE_SELECTOR, sinon elle peut lever une exception et translucent ne l'a pas.

mais ce qui me laisse perplexe, c'est que [[XXX appearance] method] dans iOS8 c'est ok mais plante dans iOS7 et Apple ne le dit pas.

2
Henson Fang

Je ne connais pas la réponse à votre question et je suis arrivé ici de google mais si vous utilisez des contrôleurs de navigation, je peux changer toute la translucidité avec cette ligne:

[self.navController.navigationBar setTranslucent:NO];
2
okysabeni

Vous ne pouvez pas modifier la propriété translucide après l'initialisation de la classe.

[newsViewNavigationController.navigationBar setTranslucent:NO];

J'ai fait quelque chose comme ça et ça a marché!

0
Ali Tüzünkan