188 votes

Comment concaténer des NSAttributedStrings ?

J'ai besoin de rechercher certaines chaînes et de définir certains attributs avant de fusionner les chaînes, donc avoir NSStrings -> Concaténer les -> Faire NSAttributedString n'est pas une option, y a-t-il un moyen de concaténer attributedString à un autre attributedString ?

222voto

0x7fffffff Points 40133

Je vous recommande d'utiliser une seule chaîne attribuée mutable comme l'a suggéré @Linuxios, et voici un autre exemple de cela :

NSMutableAttributedString *mutableAttString = [[NSMutableAttributedString alloc] init];

NSString *plainString = // ...
NSDictionary *attributes = // ... a dictionary with your attributes.
NSAttributedString *newAttString = [[NSAttributedString alloc] initWithString:plainString attributes:attributes];

[mutableAttString appendAttributedString:newAttString];

Cependant, juste pour avoir toutes les options possibles, vous pourriez aussi créer une seule chaîne attribuée mutable, faite à partir d'une NSString formatée contenant les chaînes d'entrée déjà assemblées. Vous pourriez alors utiliser addAttributes: range: pour ajouter les attributs après coup aux plages contenant les chaînes d'entrée. Je recommande toutefois la première méthode.

108voto

algal Points 4298

Si vous utilisez Swift, vous pouvez simplement surcharger la fonction + afin que vous puissiez les concaténer de la même manière que vous concaténiez des chaînes de caractères normales :

// concatenate attributed strings
func + (left: NSAttributedString, right: NSAttributedString) -> NSAttributedString
{
    let result = NSMutableAttributedString()
    result.append(left)
    result.append(right)
    return result
}

Maintenant, vous pouvez les concaténer simplement en les ajoutant :

let helloworld = NSAttributedString(string: "Hello ") + NSAttributedString(string: "World")

42voto

Josh O'Connor Points 2524

Swift 3 : Il suffit de créer une NSMutableAttributedString et d'y ajouter les chaînes attribuées.

let mutableAttributedString = NSMutableAttributedString()

let boldAttribute = [
    NSFontAttributeName: UIFont(name: "GothamPro-Medium", size: 13)!,
    NSForegroundColorAttributeName: Constants.defaultBlackColor
]

let regularAttribute = [
    NSFontAttributeName: UIFont(name: "Gotham Pro", size: 13)!,
    NSForegroundColorAttributeName: Constants.defaultBlackColor
]

let boldAttributedString = NSAttributedString(string: "Warning: ", attributes: boldAttribute)
let regularAttributedString = NSAttributedString(string: "All tasks within this project will be deleted.  If you're sure you want to delete all tasks and this project, type DELETE to confirm.", attributes: regularAttribute)
mutableAttributedString.append(boldAttributedString)
mutableAttributedString.append(regularAttributedString)

descriptionTextView.attributedText = mutableAttributedString

swift5 upd :

    let captionAttribute = [
        NSAttributedString.Key.font: Font.captionsRegular,
        NSAttributedString.Key.foregroundColor: UIColor.appGray
    ]

28voto

Linuxios Points 16966

Essayez ça :

NSMutableAttributedString* result = [astring1 mutableCopy];
[result appendAttributedString:astring2];

astring1 y astring2 son NSAttributedString s.

17voto

Andrew Points 2027

2020 | SWIFT 5.1 :

Vous êtes en mesure d'ajouter 2 NSMutableAttributedString de la manière suivante :

let concatenated = NSAttrStr1.append(NSAttrStr2)

Une autre façon de travailler avec NSMutableAttributedString y NSAttributedString les deux :

[NSAttrStr1, NSAttrStr2].joinWith(separator: "")

Une autre façon de procéder est d'utiliser ....

var full = NSAttrStr1 + NSAttrStr2 + NSAttrStr3

et :

var full = NSMutableAttributedString(string: "hello ")
// NSAttrStr1 == 1

full += NSAttrStr1 // full == "hello 1"       
full += " world"   // full == "hello 1 world"

Vous pouvez le faire avec l'extension suivante :

// works with NSAttributedString and NSMutableAttributedString!
public extension NSAttributedString {
    static func + (left: NSAttributedString, right: NSAttributedString) -> NSAttributedString {
        let leftCopy = NSMutableAttributedString(attributedString: left)
        leftCopy.append(right)
        return leftCopy
    }

    static func + (left: NSAttributedString, right: String) -> NSAttributedString {
        let leftCopy = NSMutableAttributedString(attributedString: left)
        let rightAttr = NSMutableAttributedString(string: right)
        leftCopy.append(rightAttr)
        return leftCopy
    }

    static func + (left: String, right: NSAttributedString) -> NSAttributedString {
        let leftAttr = NSMutableAttributedString(string: left)
        leftAttr.append(right)
        return leftAttr
    }
}

public extension NSMutableAttributedString {
    static func += (left: NSMutableAttributedString, right: String) -> NSMutableAttributedString {
        let rightAttr = NSMutableAttributedString(string: right)
        left.append(rightAttr)
        return left
    }

    static func += (left: NSMutableAttributedString, right: NSAttributedString) -> NSMutableAttributedString {
        left.append(right)
        return left
    }
}

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