ฉันต้องการค้นหาสตริงและตั้งค่าคุณลักษณะบางอย่างก่อนที่จะรวมสตริงดังนั้นการมี NSStrings -> เชื่อมโยงพวกเขา -> ทำให้ NSAttributedString ไม่ใช่ตัวเลือก
ฉันต้องการค้นหาสตริงและตั้งค่าคุณลักษณะบางอย่างก่อนที่จะรวมสตริงดังนั้นการมี NSStrings -> เชื่อมโยงพวกเขา -> ทำให้ NSAttributedString ไม่ใช่ตัวเลือก
คำตอบ:
ฉันขอแนะนำให้คุณใช้สตริงประกอบที่ไม่แน่นอนที่แนะนำ @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")
return NSAttributedString(attributedString: result)
Helpers
หรือและใส่ฟังก์ชั่นนี้ในแฟ้มที่มีชื่อว่าExtensions
NSAttributedString+Concatenate.swift
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
อัพเดต swift5:
let captionAttribute = [
NSAttributedString.Key.font: Font.captionsRegular,
NSAttributedString.Key.foregroundColor: UIColor.appGray
]
ลองสิ่งนี้:
NSMutableAttributedString* result = [astring1 mutableCopy];
[result appendAttributedString:astring2];
อยู่ที่ไหนastring1
และastring2
มีNSAttributedString
s
[[aString1 mutableCopy] appendAttributedString: aString2]
หรือ
NSMutableAttributedString* aString3 = [aString1 mutableCopy]; [aString3 appendAttributedString: aString2];
มันควรจะเป็น
result
NSMutableAttributedString
ไม่ใช่สิ่งที่ผู้เขียนต้องการเห็น stringByAppendingString
- วิธีนี้จะดี
2563 | SWIFT 5.1:
คุณสามารถเพิ่ม 2 NSMutableAttributedString
ด้วยวิธีต่อไปนี้:
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
}
}
NSAttrStr1.append(NSAttrStr2)
หากคุณใช้ Cocoapods ทางเลือกอื่นสำหรับทั้งสองคำตอบข้างต้นที่ให้คุณหลีกเลี่ยงความไม่แน่นอนในโค้ดของคุณคือการใช้NSAttributedString + CCLFormatหมวดหมู่ที่ยอดเยี่ยมNSAttributedString
ซึ่งช่วยให้คุณเขียนสิ่งต่อไปนี้:
NSAttributedString *first = ...;
NSAttributedString *second = ...;
NSAttributedString *combined = [NSAttributedString attributedStringWithFormat:@"%@%@", first, second];
แน่นอนมันใช้NSMutableAttributedString
ภายใต้ผ้าคลุม
นอกจากนี้ยังมีข้อได้เปรียบเพิ่มเติมจากการเป็นฟังก์ชั่นการจัดรูปแบบที่สมบูรณ์แบบดังนั้นจึงสามารถทำได้มากกว่าการต่อท้ายสตริงเข้าด้วยกัน
// 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;
}
คุณสามารถลองSwiftyFormat มันใช้ไวยากรณ์ต่อไปนี้
let format = "#{{user}} mentioned you in a comment. #{{comment}}"
let message = NSAttributedString(format: format,
attributes: commonAttributes,
mapping: ["user": attributedName, "comment": attributedComment])