将字符串添加到 NSMutableAttributedString 时出错

Error when adding a string to a NSMutableAttributedString

我有这个功能可以将项目符号添加到 textView

let bullet: String = " ● "

    func setAttributedValueForBullets(bullet: String, positionWhereTheCursorIs: Int?) {

    var textRange = selectedRange
    let selectedText = NSMutableAttributedString(attributedString: attributedText)

    if let line = positionWhereTheCursorIs {
        textRange.location = line
    }

    selectedText.mutableString.replaceCharacters(in: textRange, with: bullet)

    let paragraphStyle = createParagraphAttribute()
    selectedText.addAttributes([NSParagraphStyleAttributeName: paragraphStyle], range: NSMakeRange(textRange.location, bullet.length))

    self.attributedText = selectedText
    self.selectedRange = textRange
}

在像这样只有一行的段落中插入项目符号时,它会起作用

但是当我将它添加到多行的段落中时,就会发生这种情况

我希望它看起来像第一张图片,项目符号和文本开头没有 space

我也试过用 selectedText.insert(bullet, at: textRange.location)

而不是 selectedText.addAttributes([NSParagraphStyleAttributeName: paragraphStyle], range: NSMakeRange(textRange.location, bullet.length))

func attributeString() -> NSAttributedString{
        let attribute = NSMutableAttributedString(string: "●DESCRIPTION\n", attributes: [NSFontAttributeName : UIFont.systemFont(ofSize: 14)])
        let style = NSMutableParagraphStyle()
        style.lineSpacing = 10
        let range = NSMakeRange(0, attribute.string.characters.count)
        attribute.addAttribute(NSParagraphStyleAttributeName, value: style, range: range)

        return attribute
    }

这实际上是因为要点和详细描述之间的 space。如果描述太长,它会按照正常行为继续自己的行,将字符串的其余部分换行。

最简单的解决方法是使用不间断的 unicode space 字符 (u00A0):

let bullet = "●\u{00A0}"
let string = "thisisaveryveryveryveryveryveryveryveryveryverylongstring"
textView.text = bullet + string

这将导致预期的行为,其中很长的字符串不会分成自己的行,因为它将连接到前面的项目符号点:

另外,如果子弹和弦之间的space太小,干脆把多个不间断的space串起来:

let bullet = "●\u{00A0}\u{00A0}"