Necesito buscar algunas cadenas y establecer algunos atributos antes de fusionar las cadenas, por lo que tener NSStrings -> Concatenarlos -> Hacer NSAttributedString no es una opción, ¿hay alguna forma de concatenar atribuString a otra atribuString?
Necesito buscar algunas cadenas y establecer algunos atributos antes de fusionar las cadenas, por lo que tener NSStrings -> Concatenarlos -> Hacer NSAttributedString no es una opción, ¿hay alguna forma de concatenar atribuString a otra atribuString?
Respuestas:
Le recomiendo que use una sola cadena atribuida mutable que sugirió @Linuxios, y aquí hay otro ejemplo de eso:
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];
Sin embargo, solo por el hecho de obtener todas las opciones, también puede crear una sola cadena atribuida mutable, hecha de una NSString formateada que contenga las cadenas de entrada ya juntas. Luego puede usar addAttributes: range:
para agregar los atributos después del hecho a los rangos que contienen las cadenas de entrada. Sin embargo, recomiendo la forma anterior.
Si está utilizando Swift, puede sobrecargar el +
operador para que pueda concatenarlos de la misma manera que concatena cadenas normales:
// concatenate attributed strings
func + (left: NSAttributedString, right: NSAttributedString) -> NSAttributedString
{
let result = NSMutableAttributedString()
result.append(left)
result.append(right)
return result
}
Ahora puede concatenarlos simplemente agregándolos:
let helloworld = NSAttributedString(string: "Hello ") + NSAttributedString(string: "World")
return NSAttributedString(attributedString: result)
Helpers
o Extensions
y pondría esta función en un archivo llamado NSAttributedString+Concatenate.swift
.
Swift 3: simplemente cree una NSMutableAttributedString y añádales las cadenas atribuidas.
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
]
Prueba esto:
NSMutableAttributedString* result = [astring1 mutableCopy];
[result appendAttributedString:astring2];
Donde astring1
y astring2
son NSAttributedString
s.
[[aString1 mutableCopy] appendAttributedString: aString2]
.
NSMutableAttributedString* aString3 = [aString1 mutableCopy]; [aString3 appendAttributedString: aString2];
.
result
como NSMutableAttributedString
. No es lo que el autor quiere ver. stringByAppendingString
- este método será bueno
2020 | SWIFT 5.1:
Puede agregar 2 NSMutableAttributedString
de la siguiente manera:
let concatenated = NSAttrStr1.append(NSAttrStr2)
Otra forma funciona con NSMutableAttributedString
y NSAttributedString
ambos:
[NSAttrStr1, NSAttrStr2].joinWith(separator: "")
Otra forma es ...
var full = NSAttrStr1 + NSAttrStr2 + NSAttrStr3
y:
var full = NSMutableAttributedString(string: "hello ")
// NSAttrStr1 == 1
full += NSAttrStr1 // full == "hello 1"
full += " world" // full == "hello 1 world"
Puede hacer esto con la siguiente extensión:
// 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
}
}
NSAttrStr1.append(NSAttrStr2)
Si está utilizando Cocoapods, una alternativa a ambas respuestas anteriores que le permiten evitar la mutabilidad en su propio código es usar la excelente categoría NSAttributedString + CCLFormat en NSAttributedString
s que le permite escribir algo como:
NSAttributedString *first = ...;
NSAttributedString *second = ...;
NSAttributedString *combined = [NSAttributedString attributedStringWithFormat:@"%@%@", first, second];
Por supuesto, solo se usa NSMutableAttributedString
debajo de las sábanas.
También tiene la ventaja adicional de ser una función de formato completa, por lo que puede hacer mucho más que agregar cadenas juntas.
// 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;
}
Puedes probar SwiftyFormat. Utiliza la siguiente sintaxis
let format = "#{{user}} mentioned you in a comment. #{{comment}}"
let message = NSAttributedString(format: format,
attributes: commonAttributes,
mapping: ["user": attributedName, "comment": attributedComment])