Swift中字面量与字符串换行符差异:XML解析按钮标题换行失效
解决iOS Swift中XML解析后按钮标题换行符不生效的问题
我之前做XML解析的项目时也遇到过一模一样的坑!问题出在XML解析器对属性里的\n处理方式上——它会把你XML里写的\n当成字面意义的两个字符(反斜杠+n),而不是iOS能识别的换行符\n。下面给你两种靠谱的解决办法:
方法一:解析后替换字符串中的字面换行符
如果没办法修改XML的内容,就在拿到属性值后,手动把字面的\\n替换成真正的换行符:
func parser(_ parser: XMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String] = [:]) { if elementName == "button" { // 先获取原始标题 guard let rawTitle = attributeDict["title"] else { return } // 把字面的"\\n"替换成真正的换行符 let formattedTitle = rawTitle.replacingOccurrences(of: "\\n", with: "\n") // 创建按钮并设置标题 let button = UIButton(type: .system) button.setTitle(formattedTitle, for: .normal) // 记得设置按钮的换行模式,确保多行显示 button.titleLabel?.numberOfLines = 0 button.titleLabel?.lineBreakMode = .byWordWrapping } }
注意这里一定要给按钮的titleLabel设置numberOfLines = 0,否则即使有换行符,按钮也只会显示第一行内容。
方法二:修改XML文件,使用XML标准换行实体
如果你能控制XML的生成,直接在属性值里用XML的换行实体 (对应ASCII中的换行符),这样解析器会直接把它转换成iOS能识别的换行符,不用额外处理:
<button title="TitleLine1 TitleLine2"/>
这样解析出来的attributeDict["title"]就是自带真正换行符的字符串,直接设置给按钮即可,同样别忘了设置titleLabel的多行属性。
为什么会出现这个问题?
XML的属性值中,\n并不是标准的转义字符(XML的转义字符只有&、<、>、"、'这几个)。所以当你在XML属性里写\n时,解析器不会把它解析成换行,而是直接保留成\和n两个普通字符,导致按钮显示的时候直接打出这两个字符,而不是换行。
内容的提问来源于stack exchange,提问作者Chuck Claunch
相关产品推荐
相关产品推荐

