swift - NSSavePannel - 如何限制用户只能保存一组目录?

标签 swift nsopenpanel nssavepanel

用户必须保存文件,但我只希望他们将文件保存在一个文件夹中。如何做到这一点?

我已经尝试过实现委托(delegate)并强制设置目录(如果目录不同)。这是行不通的。当保存面板打开时,用户仍然可以选择其他文件夹

extension Project:  NSOpenSavePanelDelegate  {
    func panel(_ sender: Any, didChangeToDirectoryURL url: URL?) {
        if url != testsFolder {
            (sender as! NSSavePanel).directoryURL = testsFolder
        }
    }

    func panel(_ sender: Any, validate url: URL) throws {
        if url.deletingLastPathComponent() != testsFolder {
            (sender as! NSSavePanel).directoryURL = testsFolder
            throw ProjectError.scriptInitiliation
        }
    }
}

最佳答案

The thing is, the folder is already fix fixed within the app.

此时需要获取用户访问此文件夹的权限。使用打开(而不是保存)对话框让用户确认文件夹的选择。将此视为“确认访问对话框”,您可以:

  • 使用prompt将“打开”按钮的标签更改为其他内容
  • 设置标题消息,使对话框明显是一个确认对话框
  • 使用 directoryURL 将初始文件夹设置为您想要确认的文件夹的父文件夹(注意:对话框打开后directoryURL 进行任何更改 up 被忽略,因此您无法使用委托(delegate) didChangeToDirectoryURL 将对话框锁定到该文件夹​​ - 在早期的沙箱中您可以,但 Apple 现在已停止这样做)
  • 设置delegate并使用其shouldEnablevalidate回调来确保只能选择您希望确认的文件夹或对话已取消。
  • canCreateDirectoriescanChooseFiles设置为false,将canChooseDirectories设置为true<

用户确认文件夹访问权限后,将安全范围的书签保存在应用程序的首选项中。您的应用程序现在可以随时重新获得对该文件夹的访问权限。有了该权限,您就可以在该文件夹中创建和打开文件和文件夹,而无需再次使用 NSOpenPanelNSSavePanel

从这一点开始,要限制用户在该文件夹中保存,请设置您自己的对话框,仅询问文件名,省略路径部分,并绕过 NSSavePanel - 您可以模拟标准对话框或设计从头开始你自己的。

HTH

关于swift - NSSavePannel - 如何限制用户只能保存一组目录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58550993/

相关文章:

swift - vapor 构建命令不适用于 Swift 3.0

ios - 无法更改状态栏样式

objective-c - 让 NSOpenPanel 打开自定义目录

objective-c - 仅允许 NSOpenPanel 中的文件夹和文件

c++ - 来自 C++ boost 线程的 NSOpenPanel

ios - 放大 uiscrollview 中的所有 subview

ios - 如何立即替换呈现的 UIViewController?

swift - macOS - 如何让 NSSavePanel 在文件名中添加文件扩展名?

objective-c - 使用 NSSavePanel,用户如何选择要保存的特定文件类型?