How can I concatenate NSAttributedStrings?

前端 未结 8 1356
野性不改
野性不改 2020-12-04 08:58

I need to search some strings and set some attributes prior to merging the strings, so having NSStrings -> Concatenate them -> Make NSAttributedString is not an option, is t

相关标签:
8条回答
  • 2020-12-04 09:29

    2020 | SWIFT 5.1:

    You're able to add 2 NSMutableAttributedString by the following way:

    let concatenated = NSAttrStr1.append(NSAttrStr2)
    

    Another way works with NSMutableAttributedString and NSAttributedString both:

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

    Another way is....

    var full = NSAttrStr1 + NSAttrStr2 + NSAttrStr3
    

    and:

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

    You can do this with the following extension:

    // 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
        }
    }
    
    0 讨论(0)
  • 2020-12-04 09:30

    You can try SwiftyFormat It uses following syntax

    let format = "#{{user}} mentioned you in a comment. #{{comment}}"
    let message = NSAttributedString(format: format,
                                     attributes: commonAttributes,
                                     mapping: ["user": attributedName, "comment": attributedComment])
    
    0 讨论(0)
  • 2020-12-04 09:39

    If you're using Swift, you can just overload the + operator so that you can concatenate them in the same way you concatenate normal strings:

    // concatenate attributed strings
    func + (left: NSAttributedString, right: NSAttributedString) -> NSAttributedString
    {
        let result = NSMutableAttributedString()
        result.append(left)
        result.append(right)
        return result
    }
    

    Now you can concatenate them just by adding them:

    let helloworld = NSAttributedString(string: "Hello ") + NSAttributedString(string: "World")
    
    0 讨论(0)
  • 2020-12-04 09:40

    If you're using Cocoapods, an alternative to both above answers that let you avoid mutability in your own code is to use the excellent NSAttributedString+CCLFormat category on NSAttributedStrings that lets you write something like:

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

    It of course it just uses NSMutableAttributedString under the covers.

    It also has the extra advantage of being a fully fledged formatting function — so it can do a lot more than appending strings together.

    0 讨论(0)
  • 2020-12-04 09:47

    I'd recommend you use a single mutable attributed string a @Linuxios suggested, and here's another example of that:

    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];
    

    However, just for the sake of getting all the options out there, you could also create a single mutable attributed string, made from a formatted NSString containing the input strings already put together. You could then use addAttributes: range: to add the attributes after the fact to the ranges containing the input strings. I recommend the former way though.

    0 讨论(0)
  • 2020-12-04 09:52

    Swift 3: Simply create a NSMutableAttributedString and append the attributed strings to them.

    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
        ]
    
    0 讨论(0)
提交回复
热议问题