Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift NSSavePannel-如何限制用户只保存一个一组目录?_Swift_Nsopenpanel_Nssavepanel - Fatal编程技术网

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

Swift NSSavePannel-如何限制用户只保存一个一组目录?,swift,nsopenpanel,nssavepanel,Swift,Nsopenpanel,Nssavepanel,用户必须保存文件,但我只希望他们将文件保存在一个文件夹中。如何做到这一点 我已经尝试过实现委托,并在目录不同时强制设置回目录。这是行不通的。当“保存”面板打开时,用户仍可以选择其他文件夹 extension Project: NSOpenSavePanelDelegate { func panel(_ sender: Any, didChangeToDirectoryURL url: URL?) { if url != testsFolder {

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

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

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
        }
    }
}
问题是,该文件夹已在应用程序中修复


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

  • 使用
    提示符
  • 设置
    标题
    消息
    ,使对话框明显为确认对话框
  • 使用
    directoryURL
    将初始文件夹设置为要确认的文件夹的父文件夹(注意:对话框启动后对
    directoryURL
    的任何更改都将被忽略,因此您无法使用委托
    didChangeToDirectoryURL
    将对话框锁定到该文件夹–在早期的沙盒中,您可以,但苹果现在已经停止了该操作)
  • 设置
    委托
    ,并使用其
    shouldEnable
    validate
    回调,以确保只能选择您希望确认的文件夹或取消对话框
  • canCreateDirectories
    canChooseFiles
    设置为
    false
    canchooseditories
    设置为
    true
一旦用户确认文件夹访问权限,请在应用的prefs中保存一个安全范围的书签。您的应用现在可以随时重新获得对该文件夹的访问权限。有了该权限,您可以在该文件夹中创建和打开文件和文件夹,而无需再次使用
NSOpenPanel
NSSavePanel


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


HTH

请描述“不起作用”。应用程序是否崩溃?是否调用了委托方法?它不会崩溃。但当“保存”面板打开时,用户仍然可以选择其他文件夹。请用户打开请求的文件夹一次,添加一个安全范围的书签,然后只问用户文件名。@vadian。。这更像是一种解决方法。问题是,该文件夹是一个文件夹lready fix已在应用程序中修复。要求用户打开可能是一种不好的体验。我只想打开SavePannel,以便用户可以输入文件名,以便保存文件。如果用户输入一个已经存在的文件,NSSavePanel已经处理了此问题。我只是不希望用户更改文件夹,因为它已修复。(除非我误解了你说的话?)如果应用程序是沙盒式的——看起来是这样的——有两种情况:1)将文件保存在应用程序容器内,只要求用户输入文件名。2)对于容器外的任何(固定)文件夹,你需要要求用户打开文件夹一次,以创建安全范围的书签。这