将NSAttributed文本附加到UITextview

时间:2016-04-18 22:34:36

标签: ios swift2 uitextview nsattributedstring nsmutableattributedstring

我不敢相信我在问这个问题但是(一直在寻找答案一个半小时没有运气)... 如何将NSAttributedText附加到UITextView?(在Swift 2.0 +)

我正在构建一个从我的服务器下载项目的工具,当他们进来时,我想添加AttributedText,其中绿色表示成功,红色表示失败。

要做到这一点我相信我需要NSMutableAttributedString,但是UITextView只有NSattributedString,它无法访问appendAttributedString(attrString: NSAttributedString NSAttributedString)

因此,如果我有一个带有NSAttributedString的UITextView,其中“加载”为红色,我怎么能追加文本“加载”文本为绿色“成功”。

例如:

<font color="red">loading</font><font color="green">success</font>

更新

我找到了问题的答案,但我认为这不是最佳答案。

let loadingMessage = NSMutableAttributedString(string: "loading...\n")
            loadingMessage.addAttribute(NSStrokeColorAttributeName, value: UIColor.redColor(), range: NSRange(location: 0, length: 10))

            progressWindowViewController.theTextView.attributedText = loadingMessage

loadingMessage.appendAttributedString("<font color=\"#008800\">Successfully Synced Stores...</font>\n".attributedStringFromHtml!)
                progressWindowViewController.theTextView.attributedText = loadingMessage

我的上述答案有效,但是通过覆盖整个文本来实现(并且每次绘制时都会继续这样做)。我想知道是否有一种真正的方法将字符串追加到最后以获得最佳性能?

我用于HTML的扩展程序

extension String {

    var attributedStringFromHtml: NSAttributedString? {
        do {
            return try NSAttributedString(data: self.dataUsingEncoding(NSUTF8StringEncoding)!, options: [NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType], documentAttributes: nil)
        } catch _ {
            print("Cannot create attributed String")
        }
        return nil
    }
}

2 个答案:

答案 0 :(得分:3)

您可以使用NSAttributedStringNSMutableAttributedString转换为mutableCopy()copy()会为您做相反的事情,如下所示:

let string1 = NSAttributedString(string: "loading", attributes: [NSForegroundColorAttributeName: UIColor.redColor()])
let string2 = NSAttributedString(string: "success", attributes: [NSForegroundColorAttributeName: UIColor.greenColor()])

let newMutableString = string1.mutableCopy() as! NSMutableAttributedString
newMutableString.appendAttributedString(string2)

textView.attributedText = newMutableString.copy() as! NSAttributedString

由于mutableCopy()copy()都返回AnyObject,所以有点尴尬,因此您需要使用as!将其转换为一直都是正确的类型。

答案 1 :(得分:1)

    let loadingMessage = NSMutableAttributedString(string: "loading...")
    loadingMessage.addAttribute(NSStrokeColorAttributeName, value: UIColor.redColor(), range: NSRange(location: 0, length: 10))

    let textView = UITextView()
    textView.attributedText = loadingMessage