我正在将应用程序中的文本显示为本地HTML文件中的属性字符串,并填充标签,因为这使我可以灵活设置格式。为什么在这种情况下通常的字符串插值不起作用,并且有解决方法?目的是允许用户提供的用户名包含在字符串中。除了在标签中显示的HTML文件中保留“(用户)”,而不是像我期望的那样插入用户名之外,它的功能很好。我仍在学习,因此,如果这是一种奇怪且不可行的处理方式,请告诉我...
这是我的代码:
class ArticleViewController: UIViewController {
@IBOutlet weak var contentField: UITextView!
var articleID : String = ""
var user = UserDefaults.standard.object(forKey: "user") ?? "user"
override func viewDidLoad() {
super.viewDidLoad()
if let html = Bundle.main.path(forResource: "\(articleID)", ofType: "html") {
let urlToLoad = URL(fileURLWithPath: html)
let data = NSData(contentsOf: urlToLoad)
if let attributedString = try? NSAttributedString(data: data as! Data, options: [.documentType: NSAttributedString.DocumentType.html], documentAttributes: nil) {
contentField.attributedText = attributedString
}
}
}
}
感谢您的帮助!
答案 0 :(得分:0)
您将不得不在(user)
中查找并替换attributedString
的出现。
这应该有效:
import Foundation
import UIKit
var myString : NSAttributedString = NSAttributedString(string: "Hello (user), this is a message for you")
let regex = try! NSRegularExpression(pattern: "\\(user\\)", options: .caseInsensitive)
let range = NSMakeRange(0, myString.string.count)
let newString = regex.stringByReplacingMatches(in: myString.string, options: [], range: range, withTemplate: "CJDSW18")
let newAttribuetdString = NSAttributedString(string: newString, attributes: myString.attributes(at: 0, effectiveRange: nil))
print(newAttribuetdString.string)
答案 1 :(得分:0)
为什么通常的字符串插值在这种情况下不起作用
通常的字符串插值适用于Swift源文件中的String文字,而不适用于常规文本文件或html文件的内容。
您可能需要替换属性字符串中出现的(user)
。 (基本概念与Carpsen90的答案没有什么不同,但是在替换已经归属的字符串时,您需要小心。)
if let htmlURL = Bundle.main.url(forResource: articleID, withExtension: "html") {
do {
let data = try Data(contentsOf: htmlURL)
let attributedString = try NSMutableAttributedString(data: data, options: [.documentType: NSAttributedString.DocumentType.html], documentAttributes: nil)
//### When you want to compare the result...
//originalText.attributedText = attributedString
let regex = try! NSRegularExpression(pattern: "\\(user\\)")
let range = NSRange(0..<attributedString.string.utf16.count)
let matches = regex.matches(in: attributedString.string, range: range)
for match in matches.reversed() {
attributedString.replaceCharacters(in: match.range, with: user)
}
contentField.attributedText = attributedString
} catch {
// Do error processing here...
print(error)
}
}
示例。
article.html:
<html>
<head>
<meta charset="utf-8">
</head>
<body>
<i>(user)</i><b>(user)</b>
</body>
</html>
在文本视图中可以看到的内容: