May 应用程序打开一个对话框,允许选择图像并将其显示给用户。用户选择图片的代码是:
let myFiledialog = NSOpenPanel()
myFiledialog.prompt = "Upload image"
myFiledialog.canChooseDirectories = false
myFiledialog.canChooseFiles = true
myFiledialog.allowedFileTypes = ["png", "jpg", "jpeg"]
myFiledialog.allowsMultipleSelection = false
myFiledialog.begin { [weak self] result -> Void in
guard
result.rawValue == NSApplication.ModalResponse.OK.rawValue,
let selectedPath = myFiledialog.url?.path
else {
return
}
guard let image = NSImage(contentsOfFile: selectedPath) else {
return
}
someImageView.image = image
UserDefaults.standard.set(selectedPath, forKey: "imagePath")
}
我正确显示图像。这个想法是用户可以关闭应用程序,打开它并查看图像。
我正在获取图像名称:
let pathName = UserDefaults.standard.string(forKey: "imagePath")
我比较设置一个断点,pathName == selectedPath
它们是相等的。
然而,做
NSImage(contentsOfFile: pathName!)
是nil
。
这是否与我需要获取读取文件系统中的数据的权限有关?我应该将用户图像保存在我可以访问它们的其他地方吗?也许也是 NSUserDefaults 作为images.data
?
我很感激你的帮助。
感谢@matt 评论中的链接,我实现了答案。把它留在这里以防万一对任何人都有帮助。
<AppName>/<AppName>Release.entitlements
。添加允许用户使用应用范围书签和 URL ( Apple Docs ) 的权利。这是文件的样子:<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple.security.app-sandbox</key>
<true/>
<key>com.apple.security.files.user-selected.read-only</key>
<true/>
<key>com.apple.security.files.bookmarks.app-scope</key>
<true/>
</dict>
</plist>
Codable
用于保存书签数据和图像名称(或Codable
您可能拥有并需要保存的任何数据)。struct CodableImage: Codable {
let bookmarkData: Data
let name: String
}
do {
let data = try url.bookmarkData()
let codableImage = CodableImage(bookmarkData: data, name: "Awesome image")
UserDefaults.standard.set(try? JSONEncoder().encode(codableImage), forKey: "kImageKey")
} catch {
print(error)
}
首先获取CodableImage
来自UserDefaults
:
guard
let encodedImageData = UserDefaults.standard.value(forKey: "kImageKey") as? Data,
let codableImage = try? JSONDecoder().decode(CodableImage.self, from: encodedImageData)
else {
// Data could not be read or decoded or both :(
return
}
解析书签数据并在已解析的书签过期时更新书签:
var isBookmarkStale = false
guard let url = try? URL(resolvingBookmarkData: codableImage.bookmarkData, bookmarkDataIsStale: &isBookmarkStale) else {
return nil
}
if isBookmarkStale {
print("Bookmark is stale. renewing.")
// If bookmark data is stale, all occurences have to be updated.
let _ = try? url.bookmarkData()
}
最后,从解析的 url 创建图像:
let image = NSImage(contentsOf: url)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句