我正在用Swift编写,有一个包含多个用户可编辑textField和textView的应用程序,所有这些都具有attributedText编辑功能。
编辑后,信息将保存到CoreData对象,并上传到服务器进行备份。服务器将AttributedStrings保存为HTML,并在下载/同步后将其转换回NSAttributedString。
所有这些工作(尽管我获得了很多额外的属性,例如添加了段落样式),但是由于某种原因,我的文本Field,一旦保存并重新加载,就不会显示任何斜体或粗体字体属性(即使它存在,上传,下载和转换就可以了)。然而,通过相同的过程,文本View可以很好地显示文本。
知道为什么textField不能工作,而textView不能工作以显示属性文本吗?
这是一些代码,如果我缺少必要的东西,我可以添加更多代码:
示例HTML字段文本:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta http-equiv="Content-Style-Type" content="text/css">
<title></title>
<meta name="Generator" content="Cocoa HTML Writer">
<style type="text/css">
p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 16.0px Optima; color: #000000; -webkit-text-stroke: #000000}
span.s1 {font-family: 'Optima'; font-weight: bold; font-style: normal; font-size: 16.00pt; font-kerning: none; text-shadow: 0.0px -1.0px 0.0px rgba(255, 255, 255, 0)}
span.s2 {font-family: 'Optima-Regular'; font-weight: normal; font-style: normal; font-size: 16.00pt; font-kerning: none; text-shadow: 0.0px -1.0px 0.0px rgba(255, 255, 255, 0)}
span.s3 {font-family: 'Optima'; font-weight: normal; font-style: italic; font-size: 16.00pt; font-kerning: none; text-shadow: 0.0px -1.0px 0.0px rgba(255, 255, 255, 0)}
span.s4 {font-family: 'Optima-Regular'; font-weight: normal; font-style: normal; font-size: 16.00pt; text-decoration: underline ; font-kerning: none; text-shadow: 0.0px -1.0px 0.0px rgba(255, 255, 255, 0)}
</style>
</head>
<body>
<p class="p1"><span class="s1">Check</span><span class="s2"> </span><span class="s3">for</span><span class="s2"> </span><span class="s4">title</span><span class="s2"> here. <span class="Apple-converted-space">Â Â </span></span></p>
</body>
</html>
NSAttributeString / HTML转换器:
class AttrTextConverter {
func toHtmlString(attrString: NSAttributedString) -> String {
if let toData = attrString.dataFromRange(NSMakeRange(0, attrString.length), documentAttributes: [NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType], error: nil) {
let htmlNSString = NSString(data: toData, encoding: NSUTF8StringEncoding)
let htmlString = htmlNSString as! String
return htmlString
}
return ""
}
func toAttrString(htmlString: String) -> NSAttributedString {
let htmlNsString = htmlString as NSString
let htmlData = htmlNsString.dataUsingEncoding(NSUTF8StringEncoding)
var concreteString : NSAttributedString = NSAttributedString(string: "")
if let attrString = NSMutableAttributedString(data: htmlData!, options: [NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType, NSCharacterEncodingDocumentAttribute: NSUTF8StringEncoding], documentAttributes: nil, error: nil) {
attrString.enumerateAttribute(NSFontAttributeName, inRange: NSMakeRange(0, attrString.length), options: NSAttributedStringEnumerationOptions.allZeros) { value, range, stop in
if value != nil {
let oldFont = value as! UIFont
let oldName = oldFont.fontName
var newFont = defaultFont
if oldName.hasSuffix("-BoldOblique") || oldName.hasSuffix("-BoldItalic") {
newFont = defaultBoldItalic
} else if oldName.hasSuffix("-Bold") {
newFont = defaultBold
} else if oldName.hasSuffix("-Italic") || oldName.hasSuffix("-Oblique") {
newFont = defaultItalic
}
attrString.removeAttribute(NSFontAttributeName, range: range)
attrString.addAttribute(NSFontAttributeName, value: newFont, range: range)
} else {
attrString.addAttribute(NSFontAttributeName, value: defaultFont, range: NSMakeRange(0, attrString.length))
}
}
concreteString = attrString
}
return concreteString
}
}
这是viewController中的显示代码:
textView(WORKS):
if let mutStr = lesson?.valueForKey(record) as? NSAttributedString {
let newStr = fontSet.changeFontFamily(mutStr)
view.attributedText = newStr
}
textField(无效):
if let mutStr = lesson?.valueForKey(record) as? NSAttributedString {
let newStr = fontSet.changeFontFamily(mutStr)
field.attributedText = newStr
}
好吧,对我来说,解决方法是用小的textview替换文本字段。我猜这没什么大不了的,但是令人沮丧的是,从技术上讲,textFields应该能够处理属性字符串。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句