2011-04-15 49 views
5

我正在使用NSOpenPanel来允许用户选择一个文件夹来保存文档。我想限制他们可以保存的文件夹(按照层次结构)。从本质上讲,我想阻止他们选择以上任一文件夹:使用NSOpenPanel限制对某些文件夹的访问

/用户/用户名/

所以该文件夹

/用户/用户名/猫/

可以接受但是

/用户/用户名/

/应用/猫/

将不会被允许。我想知道如何实施这个限制。

谢谢。

回答

13

请注意,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; 
} 
+0

如果您可以在Swift中提供额外的解决方案,那将会很棒! – ixany 2017-07-19 14:22:56