长按后选择复制图像时,swift uitextview html图像会导致崩溃
Posted
技术标签:
【中文标题】长按后选择复制图像时,swift uitextview html图像会导致崩溃【英文标题】:swift uitextview html image causes crash when copy image is selected after long press 【发布时间】:2021-01-08 20:30:26 【问题描述】:我目前有一个 UITextView,它显示一个 NSAttributedString,其中包含带有文本和图像的 html 数据。这些数据是通过 API 接收的,因此图像和文本都组合成一个 HTML 字符串。这是解析 HTML 的函数。
let htmlData = NSString(string: myString).data(using: String.Encoding.unicode.rawValue);
let options = [NSAttributedString.DocumentReadingOptionKey.documentType:
NSAttributedString.DocumentType.html];
do
let text = try NSMutableAttributedString(data: htmlData ?? Data(), options: options, documentAttributes: nil);
text.addAttribute(NSAttributedString.Key.font, value: UIFont(name: "Arial", size: CGFloat(fontSize)) as Any, range: NSMakeRange(0, text.length));
return text;
catch let error
print(error);
return NSMutableAttributedString(string: myString);
长按图像时,会出现一个带有两个选项的菜单(1. 复制图像 2. 保存到相机胶卷)。当我点击复制图片时,应用程序崩溃并显示以下错误消息:
Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[_UIConcretePasteboard setImage:]: Argument is not an object of type UIImage [(null)]'
有谁知道如何解决这个问题,所以当长按图像并选择复制图像时,它不会崩溃?
【问题讨论】:
与此相同的问题:***.com/questions/63331409/… 【参考方案1】:您需要将图像从 html 转换为 NSTextAttachment,就像将文本转换为 NSAttributedString 一样。当将这些附件附加到 NSAttributedString 时。
它可能看起来像这样:
let htmlData = NSString(string: myString).data(using: String.Encoding.unicode.rawValue)
let options = [NSAttributedString.DocumentReadingOptionKey.documentType:
NSAttributedString.DocumentType.html]
let image = UIImage(named: IMAGENAME_FROM_HTML) ?? UIImage()
let imageAttachment = NSTextAttachment(image: image)
do
let text = try NSMutableAttributedString(data: htmlData ?? Data(), options: options, documentAttributes: nil)
text.addAttribute(.font, value: UIFont(name: "Arial", size: CGFloat(fontSize), range: NSMakeRange(0, text.length))
let textWithAttachment = try NSAttributedString(attachment: imageAttachment)
text.replaceCharacters(in: NSMakeRange(RANGE_FOR_IMAGE_IN_HTML), with: textWithAttachment)
return text
catch let error
print(error)
return NSMutableAttributedString(string: myString)
附:不要在以 swift 结尾的行上使用分号。
【讨论】:
这是有道理的,我在发布之前阅读了有关使用您的方法的信息,但实现这一点的问题实际上是获取图像。可能有多个图像,它们嵌入在 html 中。图片没有名字。图片以 src=data:image/png;base64 开头。我不想使用第三方工具进行解析。 如果它总是采用这种格式 - 当它是简单的正则表达式来获取所有图像数据时。如果要支持图像保存,你不能做其他方式。 你能澄清一下你的意思吗? 你有一些 html 代码,其中图像显示为以上是关于长按后选择复制图像时,swift uitextview html图像会导致崩溃的主要内容,如果未能解决你的问题,请参考以下文章
长按后 EditText 不显示默认的 ContextMenu
长按后如何禁用 UICollectionViewCell 上的 UILongPressGestureRecognizer?