【问题标题】:Append NSAttributed text to UITextview将 NSAttributed 文本附加到 UITextview
【发布时间】:2016-04-18 22:34:36
【问题描述】:

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

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

为此,我认为我需要 NSMutableAttributedString,但 UITextView 只有 NSattributedString,它无法访问 appendAttributedString(attrString: NSAttributedString NSAttributedString)

所以,如果我有一个 UITextView,上面有一个 NSAttributedString,上面写着红色的“正在加载”,我如何追加文本“正在加载”以及绿色的“成功”文本。

例如这样:

<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
    }
}

【问题讨论】:

    标签: ios swift2 uitextview nsattributedstring nsmutableattributedstring


    【解决方案1】:

    您可以使用mutableCopy()NSAttributedString 转换为NSMutableAttributedString,而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! 将它们转换为正确的类型。

    【讨论】:

    • 你的方法真的很有趣,我用我找到的另一个解决方案更新了我的问题,你的方法更优化吗?就像我在将其设置为 textView 后继续附加字符串一样,它会附加还是我必须继续重置 textView 上的字符串?
    • 我不想判断哪种方法更有效,这当然取决于上下文。但就性能而言,我猜想使用mutableCopy()copy() 会很快。不幸的是,您将无法对 UITextViews.attributedText 进行“实时附加”,因为这是一个不可变对象。 (由于NSMutableAttributedStringNSAttributedString 的子类,您可以为UITextView 分配一个可变字符串。但是,在这里调用appendAttributedString() 不起作用-似乎UITextView 正在进行一些内部转换)
    • 您的回答有所帮助,唯一的区别是我将字符串定义为 NSMutableAttributedString 开始以避免转换。不幸的是 UITextview 没有正确附加的内部方法。
    • 如何使用来自textView.attributedText 的已格式化字符串并在其上附加一些内容?
    【解决方案2】:
        let loadingMessage = NSMutableAttributedString(string: "loading...")
        loadingMessage.addAttribute(NSStrokeColorAttributeName, value: UIColor.redColor(), range: NSRange(location: 0, length: 10))
    
        let textView = UITextView()
        textView.attributedText = loadingMessage
    

    【讨论】:

    • 这并没有附加成功这个词吗?这是这个问题的关键部分。这只是展示了如何在我已经知道如何做的范围内使文本变为红色。另请记住,我知道如何附加普通文本,但在这种情况下,我们将附加表示成功的“绿色”文本。这是很难弄清楚的部分。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-26
    • 2020-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多