5
我正在使用NSOpenPanel来允许用户选择一个文件夹来保存文档。我想限制他们可以保存的文件夹(按照层次结构)。从本质上讲,我想阻止他们选择以上任一文件夹:使用NSOpenPanel限制对某些文件夹的访问
/用户/用户名/
所以该文件夹
/用户/用户名/猫/
可以接受但是
/用户/用户名/
/应用/猫/
将不会被允许。我想知道如何实施这个限制。
谢谢。
我正在使用NSOpenPanel来允许用户选择一个文件夹来保存文档。我想限制他们可以保存的文件夹(按照层次结构)。从本质上讲,我想阻止他们选择以上任一文件夹:使用NSOpenPanel限制对某些文件夹的访问
/用户/用户名/
所以该文件夹
/用户/用户名/猫/
可以接受但是
/用户/用户名/
/应用/猫/
将不会被允许。我想知道如何实施这个限制。
谢谢。
请注意,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 2017-07-19 14:22:56