长按后选择复制图像时,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图像会导致崩溃的主要内容,如果未能解决你的问题,请参考以下文章

长按后Swift UiTableViewCell重置

长按后 EditText 不显示默认的 ContextMenu

长按后抬起手指时iOS中没有Javascript事件?

长按后如何跟踪按钮选择?

长按后如何禁用 UICollectionViewCell 上的 UILongPressGestureRecognizer?

如何在 Swift iOS 中禁用 UITextField 双击或长按? [复制]