iOS笔记APP:Swift4中NSAttributedString存库后无法提取文本及图片
解决iOS富文本(含NSTextAttachment)存储数据库后无法提取内容的问题
嘿,我完全懂你现在的困扰——辛辛苦苦把带图片的富文本放进UITextView,存到数据库的Varchar字段后,再读出来就没法正常提取文本和图片了对吧?这事儿我之前做笔记应用的时候也踩过一模一样的坑,咱们来捋清楚问题根源,再给你靠谱的解决方案。
问题根源
你直接把NSAttributedString转成普通字符串存到Varchar字段里,这会丢失NSTextAttachment里的图片二进制数据。因为Varchar只能存储纯文本内容,而NSTextAttachment包含的是二进制图片资源,转成字符串的过程中这些二进制信息会被丢弃,所以读回来的字符串根本没法还原成带图片的富文本。
正确的解决方案
1. 存储阶段:把富文本转成可持久化的格式
不要存普通字符串,而是把NSAttributedString归档成Data,然后要么存到数据库的Blob类型字段(更高效),要么把Data转成Base64字符串存到Varchar字段(兼容现有字段类型)。
示例代码:
// 假设你已经有了要存储的attributedString let attributedString = textView.attributedText // 归档成Data do { let archivedData = try NSKeyedArchiver.archivedData( withRootObject: attributedString, requiringSecureCoding: false ) // 方案一:存Blob字段(推荐) // 将archivedData存入数据库的Blob字段 // 方案二:转成Base64字符串存Varchar let base64String = archivedData.base64EncodedString() // 将base64String存入数据库的Varchar字段 } catch { print("富文本归档失败:\(error.localizedDescription)") }
2. 读取阶段:还原富文本并提取内容
从数据库取出数据后,先还原成NSAttributedString,再正常枚举提取文本和图片就没问题了。
示例代码:
// 假设从数据库取出的是Base64字符串 if let base64String = yourDatabaseResult["rich_text"] as? String, let archivedData = Data(base64Encoded: base64String) { do { // 解档回NSAttributedString guard let restoredAttributedString = try NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(archivedData) as? NSAttributedString else { print("无法还原富文本") return } // 现在可以正常提取文本和图片了 var imagesArray = [UIImage]() var fullText = "" restoredAttributedString.enumerateAttribute( NSAttributedString.Key.attachment, in: NSRange(location: 0, length: restoredAttributedString.length), options: [] ) { value, range, stop in // 提取当前范围的文本 let segmentText = restoredAttributedString.attributedSubstring(from: range).string fullText += segmentText // 提取图片 if let attachment = value as? NSTextAttachment, let image = attachment.image { imagesArray.append(image) } } // 把还原后的富文本放回textView textView.attributedText = restoredAttributedString // fullText就是完整的文本内容,imagesArray是所有图片 } catch { print("富文本解档失败:\(error.localizedDescription)") } }
额外提醒
- 如果之前已经用Varchar存了一批数据,那这些数据里的图片已经丢失了,没法恢复,只能从新的数据开始用新的存储方式。
- 用
NSKeyedArchiver归档时,UIImage是默认支持归档的,所以不用担心图片的存储问题。要是你自定义了NSTextAttachment,记得让它遵守NSCoding协议。
内容的提问来源于stack exchange,提问作者thousand
相关产品推荐
相关产品推荐

