web-dev-qa-db-ja.com

NSAttributedStringを連結するにはどうすればよいですか?

文字列をマージする前にいくつかの文字列を検索し、属性を設定する必要があるので、NSStrings->連結-> NSAttributedStringの作成はオプションではありません。attributedStringを別のattributedStringに連結する方法はありますか?

132
Ivan Ristic

@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:を使用して、入力文字列を含む範囲にファクトの後に属性を追加できます。前者の方法をお勧めします。

193
Mick MacCallum

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")
70
algal

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
26
Josh O'Connor

これを試して:

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

astring1astring2NSAttributedStringsです。

25
Linuxios

Cocoapodsを使用している場合、上記の両方の答えの代わりに、独自のコードの可変性を回避できるようにする代わりに、NSAttributedStringsで優れた NSAttributedString + CCLFormat カテゴリを使用して、

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

もちろん、NSMutableAttributedStringを使用しています。

また、完全な書式設定機能であるという利点もあります。したがって、文字列を追加するだけでなく、さらに多くのことができます。

4
fatuhoku

試すことができます SwiftyFormat 次の構文を使用します

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