文字列をマージする前にいくつかの文字列を検索し、属性を設定する必要があるので、NSStrings->連結-> NSAttributedStringの作成はオプションではありません。attributedStringを別のattributedStringに連結する方法はありますか?
@Linuxiosが提案した単一の可変属性文字列を使用することをお勧めします。その別の例を次に示します。
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];
ただし、すべてのオプションを利用できるようにするために、入力文字列が既にまとめられたフォーマットされたNSStringから作成された単一の可変属性文字列を作成することもできます。その後、addAttributes: range:
を使用して、入力文字列を含む範囲にファクトの後に属性を追加できます。前者の方法をお勧めします。
Swiftを使用している場合は、通常の文字列を連結するのと同じ方法で連結できるように+
演算子をオーバーロードできます。
// concatenate attributed strings
func + (left: NSAttributedString, right: NSAttributedString) -> NSAttributedString
{
let result = NSMutableAttributedString()
result.append(left)
result.append(right)
return result
}
これで、追加するだけでそれらを連結できます。
let helloworld = NSAttributedString(string: "Hello ") + NSAttributedString(string: "World")
Swift 3:単純にNSMutableAttributedStringを作成し、属性付き文字列を追加します。
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
これを試して:
NSMutableAttributedString* result = [astring1 mutableCopy];
[result appendAttributedString:astring2];
astring1
とastring2
はNSAttributedString
sです。
Cocoapodsを使用している場合、上記の両方の答えの代わりに、独自のコードの可変性を回避できるようにする代わりに、NSAttributedString
sで優れた NSAttributedString + CCLFormat カテゴリを使用して、
NSAttributedString *first = ...;
NSAttributedString *second = ...;
NSAttributedString *combined = [NSAttributedString attributedStringWithFormat:@"%@%@", first, second];
もちろん、NSMutableAttributedString
を使用しています。
また、完全な書式設定機能であるという利点もあります。したがって、文字列を追加するだけでなく、さらに多くのことができます。
試すことができます SwiftyFormat 次の構文を使用します
let format = "#{{user}} mentioned you in a comment. #{{comment}}"
let message = NSAttributedString(format: format,
attributes: commonAttributes,
mapping: ["user": attributedName, "comment": attributedComment])
// 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;
}