J'essaye de convertir mon application dans la langue Swift.
J'ai cette ligne de code:
[[UIBarButtonItem appearanceWhenContainedIn:[UINavigationBar class], nil]
setTitleTextAttributes:textDictionary
forState:UIControlStateNormal];
Comment le convertir en Swift?
Dans la documentation d'Apple , il n'y a pas de telle méthode.
ios
swift
uiappearance
AlexZd
la source
la source
Réponses:
Mise à jour pour iOS 9:
Si vous ciblez iOS 9+ (à partir de Xcode 7 b1), il existe une nouvelle méthode dans le
UIAppearance
protocole qui n'utilise pas de varargs:Qui peut être utilisé comme ceci:
Si vous devez toujours prendre en charge iOS 8 ou une version antérieure, utilisez la réponse originale suivante à cette question.
Pour iOS 8 et 7:
Ces méthodes ne sont pas disponibles pour Swift car les méthodes varargs Obj-C ne sont pas compatibles avec Swift (voir http://www.openradar.me/17302764 ).
J'ai écrit une solution de contournement non variadique qui fonctionne dans Swift (j'ai répété la même méthode pour
UIBarItem
, qui ne descend pas deUIView
):-
Assurez-vous simplement de le faire
#import "UIAppearance+Swift.h"
dans votre en-tête de pontage.Ensuite, pour appeler depuis Swift (par exemple):
la source
ios 10 swift 3
la source
Pour iOS 8 et 7:
J'utilise une catégorie basée sur la réponse d'Alex pour spécifier plusieurs conteneurs. Il s'agit d'une solution de contournement jusqu'à ce qu'Apple prenne officiellement en charge
appearanceWhenContainedIn
Swift.UIAapparence + Swift.h
UIAppearance + Swift.m
Ajoutez ensuite
#import "UIAppearance+Swift.h"
à votre en-tête de pontage.À utiliser depuis Swift :
C'était bien si je pouvais trouver un moyen d'utiliser CVarArgType , mais je n'ai trouvé aucune solution propre.
la source
Voici une solution de contournement moins laide, mais toujours laide, inspirée par @tdun.
AppearanceBridger
.AppearanceBridger
named+(void)setAppearance
et placez le code d'apparence Objective-C dans cette méthode. Par exemple:AppearanceBridger.setAppearance()
et vous devriez être prêt à partir!J'espère que cela fonctionne bien pour les personnes qui le voient.
la source
Voici une solution de contournement laide que j'ai utilisée ...
Créez simplement une classe Objective-C Cocoa Touch (UIViewController), nommée comme vous le souhaitez.
J'ai nommé le mien
WorkaroundViewController
...Maintenant en (
WorkaroundViewController.m
):Exécutez le code d'apparence Objective-C pour
.appearanceWhenContainedIn()
(voici mon exemple):ensuite Créez un en-tête de pontage pour votre projet Swift, puis initialisez votre ViewController Objective-C dans votre code Swift, comme ceci (encore une fois, juste mon exemple):
Alors vous avez terminé! Faites-moi savoir si cela fonctionne pour vous ... Comme je l'ai dit, c'est moche, mais ça marche!
la source
Cela peut être étendu à n'importe quelle classe conforme au protocole UIAppearance - pas seulement à UIViews. Voici donc une version plus générique:
UIAapparence + Swift.h
UIAppearance + Swift.m
la source
J'ai créé un repo pour vous qui souhaitez utiliser
CocoaPods
:Ajoutez ceci dans votre
Podfile
:Importez dans votre classe:
Référence: https://github.com/levantAJ/UIViewAppearanceSwift
la source
Swift 4: iOS 9+
la source
Il semble que Swift (du moins à partir de Beta5) ne soit pas en mesure de le supporter pour des raisons que je ne connais pas. Peut-être que la fonctionnalité de langue requise est toujours en cours, car je ne peux que supposer qu'ils l'ont laissée en dehors de l'interface pour une bonne raison. Comme vous l'avez dit, selon la documentation, il est toujours disponible dans ObjC. Vraiment décevant.
la source
appearanceWhenContainedIn:
est toujours hors de la table.Vous pouvez utiliser ceci:
Edit: apparenceWhenContainedIn a été supprimé dans Swift. Cette réponse était pour la Bêta 5 de changer l'apparence du texte de tous les boutons de la barre.
la source
UIControlState.Normal
vous pouvez simplement utiliser.Normal
Swift connaît le type par inférence.appearanceWhenContainedIn
a été supprimé.Vous devriez pouvoir simplement traduire la
Objective-C
syntaxe enSwift
syntaxe.Dans swift, les méthodes doivent être déclarées comme ceci:
Vous pouvez donc essayer ceci:
Je dois encore déterminer si c'est la manière propre d'appeler une méthode de classe dans
Swift
.J'espère que cela t'aides,
la source
UIAppearance
documentation du protocole (à laquelleUIBarButtonItem
est conforme), la méthode `apparenceWhenContainedIn (_ :) existe (elle n'est tout simplement pas encore implémentée dans Swift): developer.apple .com / library / prerelease / ios / documentation / UIKit /…