2013-07-05 8 views
15

Diese Frage kann ein Duplikat von this one sein. Aber die Antworten funktionieren nicht für mich und ich möchte genauer sein.Ändern der Attribute von Teilzeichenfolgen in einem NSAttributedString

Ich habe eine NSString, aber ich brauche eine NS(Mutable)AttributedString und einige der Wörter in dieser Zeichenfolge sollte eine andere Farbe gegeben werden. Ich habe das versucht:

NSString *text = @"This is the text and i want to replace something"; 

NSDictionary *attributes = @ {NSForegroundColorAttributeName : [UIColor redColor]}; 
NSMutableAttributedString *subString = [[NSMutableAttributedString alloc] initWithString:@"AND" attributes:attributes]; 

NSMutableAttributedString *newText = [[NSMutableAttributedString alloc] initWithString:text]; 

newText = [[newText mutableString] stringByReplacingOccurrencesOfString:@"and" withString:[subString mutableString]]; 

Die "und" sollte Großbuchstaben ein rot sein.

Die Dokumentation besagt, dass mutableString die Attributzuordnungen beibehält. Aber mit meinem Ersetzungsding habe ich keinen attributedString mehr auf der rechten Seite der Zuweisung (in der letzten Zeile meines Code-Snippets).

Wie kann ich bekommen, was ich will? ;)

+0

Ändern Sie zuerst die Zeichenfolge. Erstellen Sie dann einen neuen NSMutableAttributedString mit Ihrer geänderten Zeichenfolge, und legen Sie das Attribut dann als rote Farbe fest. Sie können die Zeichenfolge nicht ändern und erwarten, dass die Attribute beibehalten werden. – croyneaus4u

Antwort

34

@ Hyperlord die Antwort wird funktionieren, aber nur, wenn es ein Vorkommen des Wortes "und" in der Eingabezeichenfolge gibt. Wie auch immer, was ich tun würde ist NSString stringByReplacingOccurrencesOfString: anfänglich zu verwenden, um jedes "und" zu einem "AND" zu ändern, dann ein wenig regex verwenden, um Übereinstimmungen in attributierten String zu erkennen, und NSForegroundColorAttributeName in diesem Bereich anwenden. Hier ein Beispiel:

NSString *initial = @"This is the text and i want to replace something and stuff and stuff"; 
NSString *text = [initial stringByReplacingOccurrencesOfString:@"and" withString:@"AND"]; 

NSMutableAttributedString *mutableAttributedString = [[NSMutableAttributedString alloc] initWithString:text]; 

NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"(AND)" options:kNilOptions error:nil]; 


NSRange range = NSMakeRange(0,text.length); 

[regex enumerateMatchesInString:text options:kNilOptions range:range usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) { 

    NSRange subStringRange = [result rangeAtIndex:1]; 
    [mutableAttributedString addAttribute:NSForegroundColorAttributeName value:[UIColor redColor] range:subStringRange]; 
}]; 

Und schließlich, nur die attributierte Zeichenfolge auf Ihr Etikett anwenden.

[myLabel setAttributedText:mutableAttributedString]; 
+0

plus 1, aber warum das "und" aktivieren? – Jeff

+0

weil es in der Frage heißt "Das 'und' sollte Großbuchstaben ein Rot sein." ;-) – Whakkee

+0

Tolle Lösung, danke. –

15

ich glaube, Sie die Stilattribute mit den entsprechenden NSRange um ein NSMutableAttributedString die bestehenden NSString verwenden und fügen Sie dann erstellen sollten die Teile, die Sie zum Beispiel betonen wollen einfärben:

NSString *text = @"This is the text and i want to replace something"; 
NSMutableAttributedString *mutable = [[NSMutableAttributedString alloc] initWithString:text]; 
[mutable addAttribute: NSForegroundColorAttributeName value:[UIColor redColor] range:[text rangeOfString:@"and"]]; 

Beachten : das ist nur von meinem Kopf und überhaupt nicht getestet ;-)

0

Hier ist eine andere Implementierung (in Swift), die hilfreich ist, wenn Sie einige komplexere Manipulationen (wie zB das Hinzufügen/Löschen von Zeichen) mit dem zugeschrieben Zeichenfolge tun:

let text = "This is the text and i want to replace something" 
let mutAttrStr = NSMutableAttributedString(string: text) 

let pattern = "\\band\\b" 
let regex = NSRegularExpression(pattern: pattern, options: .allZeros, error: nil) 

while let result = regex!.firstMatchInString(mutAttrStr.string, options: .allZeros, range:NSMakeRange(0, count(mutAttrStr.string)) { 
    let substring = NSMutableAttributedString(attributedString: mutAttrStr.attributedSubstringFromRange(result.range)) 

    // manipulate substring attributes here 
    substring.addAttribute(NSForegroundColorAttributeName, value: UIColor.redColor(), range NSMakeRange(0, count(substring.string)) 

    mutAttrStr.replaceCharactersInRange(result.range, withAttributedString: substring) 
} 

Ihre letzte zugeschrieben Zeichenfolge sollte sein:

let finalAttrStr = mutAttrStr.copy() as! NSAttributedString 
0

Bitte versuchen Sie diesen Code in Swift 2

var someStr = "This is the text and i want to replace something" 
    someStr.replaceRange(someStr.rangeOfString("and")!, with: "AND") 

    let attributeStr = NSMutableAttributedString(string: someStr) 
    attributeStr.setAttributes([NSForegroundColorAttributeName: UIColor.yellowColor()], range: NSMakeRange(17, 3)) 
    testLbl.attributedText = attributeStr 
Verwandte Themen