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 文件夹的读取权限,当我打开元数据编辑器时会出现封面图像。
在我的 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 文件夹的读取权限,当我打开元数据编辑器时会出现封面图像。