Save/Copy 使用 NSSavePanel 从 Bundle 到桌面的文件
Save/Copy a file from Bundle to Desktop using NSSavePanel
我正在创建一个 macOS 应用程序,它在其 Bundle 目录中附带了一些 .zip 文件。
用户应该能够将这些文件从我的应用程序保存到自定义目录。
我发现 NSSavePanel
并认为这是正确的方法——这就是我目前所拥有的:
@IBAction func buttonSaveFiles(_ sender: Any) {
let savePanel = NSSavePanel()
let bundleFile = Bundle.main.resourcePath!.appending("/MyCustom.zip")
let targetPath = NSHomeDirectory()
savePanel.directoryURL = URL(fileURLWithPath: targetPath.appending("/Desktop"))
// Is appeding 'Desktop' a good solution in terms of localisation?
savePanel.message = "My custom message."
savePanel.nameFieldStringValue = "MyFile"
savePanel.showsHiddenFiles = false
savePanel.showsTagField = false
savePanel.canCreateDirectories = true
savePanel.allowsOtherFileTypes = false
savePanel.isExtensionHidden = true
savePanel.beginSheetModal(for: self.view.window!, completionHandler: {_ in })
}
我找不到如何 'hand over' bundleFile
到 savePanel
。
所以我的主要问题是: 我怎样才能 save/copy 从应用程序包到自定义目录的文件?
附加问题依赖NSSavePanel
: 1) 好像默认没有本地化(我的Xcode scheme 设置成德文,但是面板出现英文),我是不是要自定义那是我自己吗? 2) 有没有办法让面板默认展开?
您应该使用 Bundle.main.url
获取现有文件 URL,然后使用面板获取目标 URL,然后复制文件。该面板不对文件做任何事情,它只是获取它们的 URL.
示例:
// the panel is automatically displayed in the user's language if your project is localized
let savePanel = NSSavePanel()
let bundleFile = Bundle.main.url(forResource: "MyCustom", withExtension: "zip")!
// this is a preferred method to get the desktop URL
savePanel.directoryURL = FileManager.default.urls(for: .desktopDirectory, in: .userDomainMask).first!
savePanel.message = "My custom message."
savePanel.nameFieldStringValue = "MyFile"
savePanel.showsHiddenFiles = false
savePanel.showsTagField = false
savePanel.canCreateDirectories = true
savePanel.allowsOtherFileTypes = false
savePanel.isExtensionHidden = true
if let url = savePanel.url, savePanel.runModal() == NSFileHandlingPanelOKButton {
print("Now copying", bundleFile.path, "to", url.path)
// Do the actual copy:
do {
try FileManager().copyItem(at: bundleFile, to: url)
} catch {
print(error.localizedDescription)
}
} else {
print("canceled")
}
另外请注意,是否展开面板是用户的选择,您不能从您的应用中强制执行。
我正在创建一个 macOS 应用程序,它在其 Bundle 目录中附带了一些 .zip 文件。
用户应该能够将这些文件从我的应用程序保存到自定义目录。
我发现 NSSavePanel
并认为这是正确的方法——这就是我目前所拥有的:
@IBAction func buttonSaveFiles(_ sender: Any) {
let savePanel = NSSavePanel()
let bundleFile = Bundle.main.resourcePath!.appending("/MyCustom.zip")
let targetPath = NSHomeDirectory()
savePanel.directoryURL = URL(fileURLWithPath: targetPath.appending("/Desktop"))
// Is appeding 'Desktop' a good solution in terms of localisation?
savePanel.message = "My custom message."
savePanel.nameFieldStringValue = "MyFile"
savePanel.showsHiddenFiles = false
savePanel.showsTagField = false
savePanel.canCreateDirectories = true
savePanel.allowsOtherFileTypes = false
savePanel.isExtensionHidden = true
savePanel.beginSheetModal(for: self.view.window!, completionHandler: {_ in })
}
我找不到如何 'hand over' bundleFile
到 savePanel
。
所以我的主要问题是: 我怎样才能 save/copy 从应用程序包到自定义目录的文件?
附加问题依赖NSSavePanel
: 1) 好像默认没有本地化(我的Xcode scheme 设置成德文,但是面板出现英文),我是不是要自定义那是我自己吗? 2) 有没有办法让面板默认展开?
您应该使用 Bundle.main.url
获取现有文件 URL,然后使用面板获取目标 URL,然后复制文件。该面板不对文件做任何事情,它只是获取它们的 URL.
示例:
// the panel is automatically displayed in the user's language if your project is localized
let savePanel = NSSavePanel()
let bundleFile = Bundle.main.url(forResource: "MyCustom", withExtension: "zip")!
// this is a preferred method to get the desktop URL
savePanel.directoryURL = FileManager.default.urls(for: .desktopDirectory, in: .userDomainMask).first!
savePanel.message = "My custom message."
savePanel.nameFieldStringValue = "MyFile"
savePanel.showsHiddenFiles = false
savePanel.showsTagField = false
savePanel.canCreateDirectories = true
savePanel.allowsOtherFileTypes = false
savePanel.isExtensionHidden = true
if let url = savePanel.url, savePanel.runModal() == NSFileHandlingPanelOKButton {
print("Now copying", bundleFile.path, "to", url.path)
// Do the actual copy:
do {
try FileManager().copyItem(at: bundleFile, to: url)
} catch {
print(error.localizedDescription)
}
} else {
print("canceled")
}
另外请注意,是否展开面板是用户的选择,您不能从您的应用中强制执行。