web-dev-qa-db-fra.com

Swift 3 NSAttributedString attributs multiples

je viens juste de commencer Swift 3 et j'ai des problèmes avec la syntaxe Swift. 

j'essaie d'afficher une NSAttributedString simple. 

alors je mets mes attributs en premier: 

let attributeFontSaySomething : [String : AnyObject] = [NSFontAttributeName : UIFont.fontSaySomething()]
let attributeColorSaySomething : [String : AnyObject] = [NSForegroundColorAttributeName : UIColor.blue]

Ensuite, je crée ma chaîne: 

let attStringSaySomething = NSAttributedString(string: "Say something", attributes: self.attributeFontSaySomething)

Ce que je voudrais faire est de créer la chaîne avec mes 2 attributs et pas seulement un. Mais quand je fais : 

let attStringSaySomething = NSAttributedString(string: "Say something", attributes: [self.attributeFontSaySomething, self.attributeColorSaySomething])

Xcode me dit que je ne peux pas et que je veux changer cela pour un dictionnaire littéral. 

Comment créer ma chaîne avec les 2 attributs sans utiliser une variable NSMutableAttributedString

13
user2206906

Le problème principal est que vous passez un array [attr.. , attr...] au lieu d’un dictionary .

Vous devez fusionner les deux dictionnaires en un seul.

let attributeFontSaySomething : [String : Any] = [NSFontAttributeName : UIFont.systemFont(ofSize: 12.0)]
let attributeColorSaySomething : [String : Any] = [NSForegroundColorAttributeName : UIColor.blue]

var attributes = attributeFontSaySomething
for (key, value) in attributeColorSaySomething {
    attributes(value, forKey: key)
}

let attStringSaySomething = NSAttributedString(string: "Say something", attributes: attributes)

Cependant, il pourrait être plus facile de créer le dictionnaire littéralement:

let attributes : [String : Any] = [NSFontAttributeName : UIFont.systemFont(ofSize: 12.0), NSForegroundColorAttributeName : UIColor.blue]
22
vadian

Créez simplement un dictionnaire avec les deux ensembles d'attributs:

let attributes: [String:AnyObject] = 
  [NSFontAttributeName : UIFont.fontSaySomething(), 
  NSForegroundColorAttributeName : UIColor.blue]

Et utilisez ensuite le dictionnaire avec les deux paires clé/valeur lors de la création de votre chaîne attribuée.

Swift ne contient pas de mécanisme intégré permettant de combiner des dictionnaires, mais vous pouvez ajouter une substitution à l'opérateur + si vous souhaitez pouvoir ajouter des dictionnaires ensemble (vous devez déterminer quoi faire si les deux dictionnaires contiennent la même clé). toutefois.)

6
Duncan C

Merci pour la réponse de @ vadian

Mise à jour pour Swift 4

let attributes : [NSAttributedStringKey : Any] = [NSAttributedStringKey(rawValue: NSAttributedStringKey.font.rawValue) : UIFont.systemFont(ofSize: 12.0), NSAttributedStringKey(rawValue: NSAttributedStringKey.foregroundColor.rawValue) : UIColor(hex:"4C0000")]

refreshControl.attributedTitle=NSAttributedString(string: "Refreshing...", attributes: attributes)
2
Baljeet Singh

Utilisez comme ceci:

let attStringSaySomething = NSAttributedString.init(string: "Hello", attributes: [NSFontAttributeName: UIFont.systemFont(ofSize: 16), NSForegroundColorAttributeName:UIColor.black])
1
Poles

Vous pouvez utiliser ce code pour différents attributs sur différentes chaînes. Avec la police Roboto (For police Roboto use MDFRobotoFontLoader)

let yourAttributes = [NSForegroundColorAttributeName: UIColor.black, NSFontAttributeName: MDFRobotoFontLoader.sharedInstance().regularFont(ofSize: 20)]

let finalString =  NSMutableAttributedString(string: "", attributes: yourAttributes)

let attributeStr =  NSMutableAttributedString(string: "XYZGFDGii", attributes: yourAttributes)
       finalString.append(attributeStr)

let yourOtherAttributes = [NSForegroundColorAttributeName: UIColor.red, NSFontAttributeName: MDFRobotoFontLoader.sharedInstance().regularFont(ofSize: 24)]

let partTwo = NSMutableAttributedString(string: "hfjghlkdhkjld", attributes: yourOtherAttributes)
       finalString.append(partTwo)

Cet exemple utilise la police Roboto 

1
DURGESH Chaurasiya

Le problème est que vous insérez deux dictionnaires dans un dictionnaire, ce qui n’attend que [String: Any], pas [[String: Any], [String: Any]] type . Vous pouvez effectuer les opérations suivantes:

let attStringSaySomething = NSAttributedString(string: "Say something", attributes: [NSFontAttributeName : UIFont.fontSaySomething(), NSForegroundColorAttributeName : UIColor.blue])

Vous pouvez également regrouper les valeurs dans des tuples au lieu de dictionnaires et les insérer dans votre dictionnaire en fonction de la clé et de la valeur:

let attributeFontSaySomething = (key: NSFontAttributeName, value: UIFont.fontSaySomething())
let attributeColorSaySomething = (key: NSForegroundColorAttributeName, value: UIColor.blue)

let attStringSaySomething = NSAttributedString(string: "Say something", attributes: [attributeFontSaySomething.key : attributeFontSaySomething.value,attributeColorSaySomething.key : attributeColorSaySomething.value])
0
dirtydanee