UIAppearance "quand non contenu dans"

Je suis en train de tourner un web complexe de modificateurs UIAppearance *, et j'ai rencontré un problème.

Mon utilisation du protocole d'apparence UIBarButton personnalisé de UIBarButton fait que MFMailComposerViewController se plaint et cesse de fonctionner.

Par conséquent, au lieu d'utiliser la méthode whenContainedIn pour spécifier les classs qui provoquent la modification, existe-t-il un moyen d'exclure certaines classs, c'est-à-dire un "when not contained in"?

* Je parle du protocole UIAppearance qui est utilisé pour prédéfinir les parameters d'apparence des objects dans le délégué de l'application.

Vous pouvez utiliser appearanceWhenContainedIn: pour spécifier une modification nulle, ce qui donnera l'apparence par défaut:

 [[UIBarButton appearance] setBarTintColor:[UIColor redColor]]; [[UIBarButton appearanceWhenContainedIn:[MFMailComposerViewController class], nil] setBarTintColor:nil]; 

À partir de iOS 9 SDK, il y a aussi

 [[UIBarButton appearance] setBarTintColor:[UIColor redColor]]; [[UIBarButton appearanceWhenContainedInInstancesOfClasses:@[[MFMailComposerViewController class]] setBarTintColor:nil]; 

Ce qui peut être utilisé Swift-2 comme ça:

 UIBarButton.appearance().barTintColor = UIColor.redColor() UIBarButton.appearanceWhenContainedInInstancesOfClasses([MFMailComposerViewController.self]).barTintColor = nil 

Pour moi, j'ai utilisé celui-ci qui fonctionne dans iOS 10,

 [[UITextField appearanceWhenContainedInInstancesOfClasses:@[[UISearchBar class]]] setTextColor:[UIColor darkGrayColor]]; 

Ma solution consiste à créer une sous-class personnalisée de tous les controllers de vue conteneur utilisés dans l'application en tant que sous- UIWindow UIWindow principales (controller racine de la window ou controllers de vue présentés), tels que UINavigationController , UITabBarController ou UISplitViewController .

Supposons que l'application utilise uniquement UINavigationController . Créer une sous-class:

 class CustomizedNavigationController: UINavigationController {} 

Ensuite, utilisez CustomizedNavigationController au lieu de UINavigationController simple partout dans l'application.

En outre, au lieu de spécifier l'apparence de chaque UIBarButton , spécifiez l'apparence uniquement lorsqu'elle est contenue dans la sous-class:

 UIBarButtonItem.appearance(whenContainedInInstancesOf: [CustomizedNavigationController.self]) 

Étant MFMailComposerViewController que MFMailComposerViewController n'utilise pas la sous-class, il ne sera pas personnalisé.