【问题标题】:Restrict access to certain folders using NSOpenPanel使用 NSOpenPanel 限制对某些文件夹的访问
【发布时间】:2011-08-06 15:53:24
【问题描述】:

我正在使用 NSOpenPanel 允许用户选择一个文件夹来保存文档。我想限制他们可以保存到哪个文件夹(就层次结构而言)。本质上,我想阻止他们选择上面的任何文件夹:

/用户/用户名/

所以文件夹

/用户/用户名/猫/

可以接受,但是

/用户/用户名/

/应用程序/猫/

不允许。我想知道如何实现这个限制。

谢谢。

【问题讨论】:

    标签: objective-c cocoa macos restriction nsopenpanel


    【解决方案1】:

    请注意,NSOpenPanel 继承自 NSSavePanel,后者又定义了一个委托和相应的委托协议 NSOpenSavePanelDelegate。您可以使用委托来扩展打开面板的行为,以包括您在问题中列出的限制。

    例如,假设应用程序委托实现了打开面板限制,使其符合NSOpenSavePanelDelegate协议:

    @interface AppDelegate : NSObject <NSApplicationDelegate, NSOpenSavePanelDelegate>
    @end
    

    在您的应用程序委托的实现中,告诉打开面板应用程序代理充当打开面板代理:

    NSOpenPanel *openPanel = [NSOpenPanel openPanel];
    [openPanel setDirectory:NSHomeDirectory()];
    [openPanel setCanChooseDirectories:NO];
    [openPanel setDelegate:self];
    [openPanel runModal];
    

    并实现以下委托方法:

    - (BOOL)panel:(id)sender shouldEnableURL:(NSURL *)url {
        NSString *path = [url path];
        NSString *homeDir = NSHomeDirectory();
    
        return [path hasPrefix:homeDir] && ! [path isEqualToString:homeDir];
    }
    
    - (void)panel:(id)sender didChangeToDirectoryURL:(NSURL *)url {
        NSString *path = [url path];
        NSString *homeDir = NSHomeDirectory();
    
        // If the user has changed to a non home directory, send him back home!
        if (! [path hasPrefix:homeDir]) [sender setDirectory:homeDir];
    }
    
    - (BOOL)panel:(id)sender validateURL:(NSURL *)url error:(NSError **)outError {
        NSString *path = [url path];
        NSString *homeDir = NSHomeDirectory();
    
        if (![path hasPrefix:homeDir]) {
            if (outError)
               *outError = ; // create an appropriate NSError instance
    
            return NO;    
        }
        return YES;
    }
    

    【讨论】:

    • 如果你能在 Swift 中提供额外的解决方案,那就太好了!
    • @ixany • 问题和答案均于 2011 年发布。Swift 1.0 于 2014 年推出。问题标签没有 swift。回答问题的人不再是 SO 成员。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-31
    • 2012-08-23
    • 2016-07-07
    • 1970-01-01
    • 2012-05-26
    • 2012-05-19
    相关资源
    最近更新 更多