Tôi cần tìm kiếm một số chuỗi và đặt một số thuộc tính trước khi hợp nhất các chuỗi, vì vậy, có NSStrings -> Nối chúng -> Tạo NSAttributionString không phải là một tùy chọn, có cách nào để ghép các thuộc tínhString sang một thuộc tính khác không?
Tôi cần tìm kiếm một số chuỗi và đặt một số thuộc tính trước khi hợp nhất các chuỗi, vì vậy, có NSStrings -> Nối chúng -> Tạo NSAttributionString không phải là một tùy chọn, có cách nào để ghép các thuộc tínhString sang một thuộc tính khác không?
Câu trả lời:
Tôi khuyên bạn nên sử dụng một chuỗi thuộc tính có thể thay đổi duy nhất mà @Linuxios đề xuất và đây là một ví dụ khác về điều đó:
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];
Tuy nhiên, chỉ để có được tất cả các tùy chọn ngoài đó, bạn cũng có thể tạo một chuỗi thuộc tính có thể thay đổi duy nhất, được tạo từ một NSString được định dạng có chứa các chuỗi đầu vào được đặt cùng nhau. Sau đó, bạn có thể sử dụng addAttributes: range:
để thêm các thuộc tính sau thực tế vào các phạm vi có chứa các chuỗi đầu vào. Tôi đề nghị cách trước đây mặc dù.
Nếu bạn đang sử dụng Swift, bạn chỉ có thể quá tải +
toán tử để có thể nối chúng giống như cách bạn nối các chuỗi thông thường:
// concatenate attributed strings
func + (left: NSAttributedString, right: NSAttributedString) -> NSAttributedString
{
let result = NSMutableAttributedString()
result.append(left)
result.append(right)
return result
}
Bây giờ bạn có thể nối chúng chỉ bằng cách thêm chúng:
let helloworld = NSAttributedString(string: "Hello ") + NSAttributedString(string: "World")
return NSAttributedString(attributedString: result)
Helpers
hoặc Extensions
đặt chức năng này vào một tệp có tên NSAttributedString+Concatenate.swift
.
Swift 3: Đơn giản chỉ cần tạo NSMutableAttributionString và nối các chuỗi được gán cho chúng.
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
cập nhật swift5:
let captionAttribute = [
NSAttributedString.Key.font: Font.captionsRegular,
NSAttributedString.Key.foregroundColor: UIColor.appGray
]
Thử cái này:
NSMutableAttributedString* result = [astring1 mutableCopy];
[result appendAttributedString:astring2];
Ở đâu astring1
và astring2
đang NSAttributedString
s.
[[aString1 mutableCopy] appendAttributedString: aString2]
.
NSMutableAttributedString* aString3 = [aString1 mutableCopy]; [aString3 appendAttributedString: aString2];
.
result
như NSMutableAttributedString
. nó không phải là những gì tác giả muốn thấy. stringByAppendingString
- phương pháp này sẽ tốt
2020 | Chuyển đổi 5.1:
Bạn có thể thêm 2 NSMutableAttributedString
bằng cách sau:
let concatenated = NSAttrStr1.append(NSAttrStr2)
Một cách khác làm việc với NSMutableAttributedString
và NSAttributedString
cả hai:
[NSAttrStr1, NSAttrStr2].joinWith(separator: "")
Một cách khác là ....
var full = NSAttrStr1 + NSAttrStr2 + NSAttrStr3
và:
var full = NSMutableAttributedString(string: "hello ")
// NSAttrStr1 == 1
full += NSAttrStr1 // full == "hello 1"
full += " world" // full == "hello 1 world"
Bạn có thể làm điều này với phần mở rộng sau:
// 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)
Nếu bạn đang sử dụng Cocoapods, một giải pháp thay thế cho cả hai câu trả lời trên cho phép bạn tránh được tính đột biến trong mã của riêng bạn là sử dụng danh mục NSAttributionString + CCLFormat tuyệt vời trên NSAttributedString
s cho phép bạn viết một cái gì đó như:
NSAttributedString *first = ...;
NSAttributedString *second = ...;
NSAttributedString *combined = [NSAttributedString attributedStringWithFormat:@"%@%@", first, second];
Nó tất nhiên nó chỉ sử dụng NSMutableAttributedString
dưới vỏ bọc.
Nó cũng có thêm lợi thế là một chức năng định dạng đầy đủ - vì vậy nó có thể làm được nhiều việc hơn là nối các chuỗi lại với nhau.
// 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;
}
Bạn có thể thử SwiftyFormat Nó sử dụng cú pháp sau
let format = "#{{user}} mentioned you in a comment. #{{comment}}"
let message = NSAttributedString(format: format,
attributes: commonAttributes,
mapping: ["user": attributedName, "comment": attributedComment])