NSAttributedStrings를 어떻게 연결합니까?


159

문자열을 병합하기 전에 일부 문자열을 검색하고 일부 속성을 설정해야하므로 NSStrings-> 연결-> NSAttributedString을 옵션으로 사용하지 마십시오.


13
2016 년 8 월에 이것이 여전히 어려워지는 것은 우스운 일입니다.
Wedge Martin

17
2018 년에도 ...
DehMotth

11
여전히 2019 년;)
raistlin

8
아직도 2020 년에 ...
김황호

답변:


210

@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:사실 이후 속성을 입력 문자열을 포함하는 범위에 추가하는 데 사용할 수 있습니다. 나는 이전 방법을 권장합니다.


속성을 추가하는 대신 문자열을 추가하는 것이 좋습니다.
ma11hew28

87

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

5
변경 가능한 클래스는 변경 불가능한 클래스의 하위 유형입니다.
algal

4
불변 부모 유형을 예상하지만 그 반대의 상황에서는 변경 가능한 하위 유형을 사용할 수 있습니다. 서브 클래 싱 및 상속을 검토 할 수 있습니다.
algal

6
예, 방어를 원할 경우 방어 사본을 작성해야합니다.
algal

1
NSAttributedString을 실제로 반환하려면 다음과 같이 작동합니다.return NSAttributedString(attributedString: result)
Alex

2
@ n13 Helpersor 라는 폴더를 만들고이 Extensions함수를라는 파일에 넣습니다 NSAttributedString+Concatenate.swift.
David Lawson

34

스위프트 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

swift5 upd :

    let captionAttribute = [
        NSAttributedString.Key.font: Font.captionsRegular,
        NSAttributedString.Key.foregroundColor: UIColor.appGray
    ]

25

이 시도:

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

어디에 astring1그리고 astring2있습니다 NSAttributedString.


13
또는 [[aString1 mutableCopy] appendAttributedString: aString2].
JWWalker

@JWWalker 'oneliner'가 손상되었습니다. appendAttributedString은 문자열을 반환하지 않기 때문에이 "연결"결과를 얻을 수 없습니다. 사전과 같은 이야기
gaussblurinc

@gaussblurinc : 물론 비판은 우리가 언급 한 답변에도 적용됩니다. 이어야합니다 NSMutableAttributedString* aString3 = [aString1 mutableCopy]; [aString3 appendAttributedString: aString2];.
JWWalker 2016

@gaussblurinc, JWalker : 답변을 수정했습니다.
Linuxios

@Linuxios도로 반환 result됩니다 NSMutableAttributedString. 저자가보고 싶어하는 것이 아닙니다. stringByAppendingString-이 방법이 될 것입니다 좋은
gaussblurinc

5

2020 | 스위프트 5.1 :

NSMutableAttributedString다음과 같은 방법으로 2를 추가 할 수 있습니다 .

let concatenated = NSAttrStr1.append(NSAttrStr2)

또 다른 방법은 작동 NSMutableAttributedString하고 NSAttributedString모두 :

[NSAttrStr1, NSAttrStr2].joinWith(separator: "")

다른 방법은 ....

var full = NSAttrStr1 + NSAttrStr2 + NSAttrStr3

과:

var full = NSMutableAttributedString(string: "hello ")
// NSAttrStr1 == 1


full += NSAttrStr1 // full == "hello 1"       
full += " world"   // full == "hello 1 world"

다음 확장명으로이를 수행 할 수 있습니다.

// 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
    }
}

2
Swift 5.1을 사용하고 있으며 두 개의 NSAttrString을 함께 추가 할 수 없습니다.
PaulDoesDev

1
이상한. 이 경우에는 다음을 사용하십시오NSAttrStr1.append(NSAttrStr2)
Andrew

두 개의 NSAttrStrings를 추가하기위한 확장 기능으로 내 답변을 업데이트했습니다. :)
Andrew

4

Cocoapods를 사용하는 경우 자신의 코드에서 변경을 피할 수있는 위의 두 가지 대답에 대한 대안은 다음과 같이 작성할 수 있는 우수한 NSAttributedString + CCLFormat 범주 를 사용하는 NSAttributedString것입니다.

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

물론 그것은 단지 NSMutableAttributedString커버 아래에서 사용합니다.

또한 본격적인 형식 지정 기능이라는 이점이 있으므로 문자열을 함께 추가하는 것보다 훨씬 많은 작업을 수행 할 수 있습니다.


1
// 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

SwiftyFormat 을 사용해 볼 수 있습니다. 다음 구문을 사용합니다.

let format = "#{{user}} mentioned you in a comment. #{{comment}}"
let message = NSAttributedString(format: format,
                                 attributes: commonAttributes,
                                 mapping: ["user": attributedName, "comment": attributedComment])

1
좀 더 자세히 설명해 주시겠습니까? 어떻게 작동합니까?
Kandhal Bhutiya
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.