【问题标题】:How to limit writable directory selection in NSOpenPanel?如何限制 NSOpenPanel 中的可写目录选择?
【发布时间】:2013-06-26 09:56:42
【问题描述】:

我希望用户选择一个目录来保存文件。我最简单的代码(ARC):

NSOpenPanel *panel = [NSOpenPanel openPanel];

[panel setCanChooseDirectories:YES];
[panel setCanChooseFiles:NO];
[panel setAllowsMultipleSelection:NO];

if (NSOKButton == [panel runModal]) 
    return [[panel URLs] objectAtIndex:0];
else
    return nil;

但是,我想确保返回的路径 writeable 以便我可以将文件保存到其中。我应该如何修改我的代码?

【问题讨论】:

    标签: macos cocoa directory nsopenpanel


    【解决方案1】:

    实现shouldEnableURL委托方法如下:

    - (BOOL)panel:(id)sender shouldEnableURL:(NSURL *)url
    {
        return [[NSFileManager defaultManager] isWritableFileAtPath:[url path]];
    }
    

    这会将所有不可写的路径在打开的面板中呈现为不可选择。 充当面板代表的对象应符合NSOpenSavePanelDelegate
    不要忘记通过以下方式设置它:

    [panel setDelegate:self];
    

    关于 NSOpenSavePanelDelegate 协议的详细信息can be found in the docs

    【讨论】:

    • 哦,NSFileManager...非常感谢!
    • 哎呀!我以为昨天有效。但不是。这个方法是“-isWritable File AtPath”。但我处理的是目录 url,这总是返回“NO”。
    • 哦,对不起,我的错。我之前调用了 [url isFileURL],认为返回 URL 是否不是目录。
    【解决方案2】:

    在 Swift 中,您可以通过实现 shouldEnable url 委托方法来限制特定类型。

    
     func panel(_ sender: Any, shouldEnable url: URL) -> Bool {
            if String(url.pathExtension) == "pdf" {
                return false
            }
            return true
     }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-27
      • 1970-01-01
      • 1970-01-01
      • 2022-11-01
      相关资源
      最近更新 更多