SwiftUI 图像不显示现有文件中的图像

SwiftUI Image does not display image from existing file

在我的 SwiftUI 应用程序中,我有一个视图供人们编辑书籍的元数据,例如书名和作者。在此视图中,我有一个显示图书封面图片的图像视图。

struct ImageView: View {

    @Binding var book: Book

    var body: some View {
        // coverFile is the URL to the image file.
        let image = NSImage(byReferencing: 
            book.metadata.coverFile)
        Image(nsImage: image)
            .aspectRatio(contentMode: .fit)
    }
}

当我打开一本我设置了封面图片的书并打开元数据编辑器时,图像视图不显示任何内容。元数据编辑器有一个按钮可以选择封面图像。当我单击按钮并从文件导入器中选择一个图像文件时,该图像出现在图像视图中。如果我关闭这本书,重新打开它,然后打开元数据编辑器,图像就会出现在图像视图中。但是,如果我重新启动应用程序,打开图书,然后打开元数据编辑器,图像视图什么也不显示。

我已经尝试了各种 NSImage 初始值设定项。我尝试从 Data 对象和 NSBitmapImageRep.

构建图像
extension Book {
    func coverImage() -> NSImage {
        do {
            let data = try Data(contentsOf: metadata.coverFile)
            return NSImage(data: data) ?? NSImage()
        } catch {
            Swift.print("Error reading the image data. Error: \(error)")
        }
        
        return NSImage()
    }
}

struct ImageView: View {
    @Binding var book: Book

    var body: some View {
        let image = book.coverImage()
        Image(nsImage: image)
            .aspectRatio(contentMode: .fit)
    }
}

但是当我在图像视图中设置断点并检查 image 变量时,它要么是 nil 要么是无效的。当我检查 coverFile 变量时,它显示正确的 URL,包括 .png 扩展名。

在此应用的 AppKit 版本中,我使用相同的代码创建 NSImage,图像显示在图像视图中。

根据 Apple 的文档,NSImage byReferencing 函数不会尝试从指定的 URL 检索数据或从该数据创建任何图像表示,直到应用程序尝试绘制图像或请求关于它的信息。如何让 SwiftUI 视图触发检索图像数据,以便它显示在图像视图中?

更新

我为 ImageView 结构中的图像创建了计算 属性。

var image: NSImage {
    do {
        let data = try Data(contentsOf: book.metadata.coverFile)
        return NSImage(data: data) ?? NSImage()
    } catch {
        Swift.print("Error creating the image. Error: \(error)")
    }
        return NSImage()
}

当我运行这段代码时,try Data调用抛出异常,catch块运行s,并在[=中打印如下错误信息47=]的控制台:

Error creating the image. Error: Error Domain=NSCocoaErrorDomain Code=257 "The file “ImageFile” couldn’t be opened because you don’t have permission to view it."

从文件导入器中选择一个文件可以正确创建数据。我对图像文件所在的文件夹具有 read/write 权限。

据我了解,问题归结为延迟初始化 NSImage。

您是否尝试过使用 init(contentsOfFile:) 或 init(contentsOf:)?它不会延迟初始化,因此不应导致此问题。

由于文件权限问题,图片无法显示。如果我打开 App Sandbox 并授予应用对 Pictures 文件夹的读取权限,当我打开元数据编辑器时会出现封面图像。