web-dev-qa-db-fra.com

Comment concaténer NSAttributedString?

Je dois rechercher certaines chaînes et définir certains attributs avant de les fusionner. NSStrings -> Concatenate -> Make NSAttributedString n'est donc pas une option. Existe-t-il un moyen de concaténer attributString à un autre attributString?

137
Ivan Ristic

Je vous recommande d'utiliser une seule chaîne d'attributs mutables, suggérée par @Linuxios, et voici un autre exemple:

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];

Toutefois, pour obtenir toutes les options, vous pouvez également créer une seule chaîne d'attribut modifiable, constituée d'un NSString formaté contenant les chaînes d'entrée déjà assemblées. Vous pouvez ensuite utiliser addAttributes: range: pour ajouter les attributs après coup aux plages contenant les chaînes en entrée. Je recommande cependant l'ancienne méthode.

198
Mick MacCallum

Si vous utilisez Swift, vous pouvez simplement surcharger l'opérateur + afin de pouvoir les concaténer de la même manière que vous concaténez des chaînes 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")
73
algal

Swift 3: Créez simplement une chaîne NSMutableAttributedString et ajoutez-leur 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
26
Josh O'Connor

Essaye ça:

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

astring1 et astring2 sont NSAttributedStrings.

25
Linuxios

Si vous utilisez Cocoapods, une alternative aux deux réponses ci-dessus vous permettant d'éviter la mutabilité dans votre propre code est d'utiliser l'excellent NSAttributedString + CCLFormat catégorie sur NSAttributedStrings qui vous permet d'écrire quelque chose comme :

NSAttributedString *first = ...;
NSAttributedString *second = ...;
NSAttributedString *combined = [NSAttributedString attributedStringWithFormat:@"%@%@", first, second];

Bien sûr, il utilise simplement NSMutableAttributedString sous les couvertures.

Elle présente également l’avantage supplémentaire d’être une fonction de formatage à part entière - elle peut donc faire beaucoup plus que l’ajout de chaînes ensemble.

4
fatuhoku

Vous pouvez essayer SwiftyFormat Il utilise la syntaxe suivante

let format = "#{{user}} mentioned you in a comment. #{{comment}}"
let message = NSAttributedString(format: format,
                                 attributes: commonAttributes,
                                 mapping: ["user": attributedName, "comment": attributedComment])
1
Igor Palaguta
// Immutable approach
// class method

+ (NSAttributedString *)stringByAppendingString:(NSAttributedString *)append toString:(NSAttributedString *)string {
  NSMutableAttributedString *result = [string mutableCopy];
  [result appendAttributedString:append];
  NSAttributedString *copy = [result copy];
  return copy;
}

//Instance method
- (NSAttributedString *)stringByAppendingString:(NSAttributedString *)append {
  NSMutableAttributedString *result = [self mutableCopy];
  [result appendAttributedString:append];
  NSAttributedString *copy = [result copy];
  return copy;
}
1
gaussblurinc